Java转Kotlin MVP架构的一点小问题

1,523 阅读2分钟

我的女神是巨蟹座的配图一张(国际惯例)

Kotlin刚出来一窝蜂的都去搞现在好像消停多了文章也没有那么密集啦,但是还要安利一波Kotlin还是有必要学习一下的, JakeWharton不也去了Google专搞Kotlin。 不了解的可以看看这个juejin.cn/post/684490… 一般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 {}
这样就可以愉快地玩耍啦。