Kotlin刚出来一窝蜂的都去搞现在好像消停多了文章也没有那么密集啦,但是还要安利一波Kotlin还是有必要学习一下的, JakeWharton不也去了Google专搞Kotlin。 不了解的可以看看这个juejin.im/post/591dd9… 一般Kotlin项目都是在已有的Java项目基础上进行转变,但是有的时候也会出现一些问题的。 java 中的MVP:
基类Presenter
public interface IPresenter<T extends IView> {
void attachView(T view);
void detachView();
}
基类View
public interface IView {
void showMsg(String msg);
}
public class BasePresenter<T extends IView> implements IPresenter<T> {}
基类Activity
public abstract class BaseActivity<T extends IPresenter> extends RxAppCompatActivity implements IView {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mPresenter != null) {
mPresenter.attachView(this);
}
}
}
复制代码
Kotlin中的MVP: 其实没有多大差别
基类Presenter
interface IPresenter<in V : IView> {
fun attachView(mRootView: V)
fun detachView()
}
基类View
interface IView {
fun showMsg()
}
abstract class BasePresenter<T : IView> : IPresenter<T> {}
复制代码
问题就出在BaseActivity的转化过程中 正常直接转
abstract class BaseActivity<T : IPresenter> : AppCompatActivity(), IView {}
这样存在一个问题就是在IPresenter处会提示缺少泛型当初的解决办法简单粗暴直接
abstract class BaseActivity<T : IPresenter<*>> : AppCompatActivity(), IView {}
但是这样仍然会有个问题就是在添加view的时候会出现
mPresenter?.attachView(this)会报错
Type mismatch.
Required:
Nothing
Found:
BaseActivity<T>
当时不理解啊 怎么会有这个问题 问了问群里的人 也没回答,百度也没找到答案,最后还是Google在Stack Overflow上找到了答案 吐槽一下 百度是真的垃圾 哈哈哈
abstract class BaseActivity<in V : IView, T : IPresenter<V>> : AppCompatActivity(), IView {}
增加一个view泛型添加view时 mPresenter?.attachView(this as V)这样就可以啦 当然在用的时候也会有一点跟java不一样的小变化
class MainActivity : BaseActivity<MainContract.View, MainPresenter>(), MainContract.View {}
这样就可以愉快地玩耍啦。
复制代码