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