Java轉Kotlin MVP架構的一點小問題

Android大混子發表於2018-01-24

Java轉Kotlin  MVP架構的一點小問題
我的女神是巨蟹座的配圖一張(國際慣例)

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 {}
這樣就可以愉快地玩耍啦。
複製程式碼

相關文章