在使用Kotlin重構原來的Java項目時,Base類中Java的泛型,轉Kotlin竟然報錯了,下面看一段偽代碼
//Java版本的Base接口如下:
//Presenter層抽象接口
public interface IPresenter <V>{}
public abstract class BasePresenter<V extends BaseView<?>> implements IPresenter<V> {
//view引用
V view;
}
public interface IView <P>{}
public abstract class BaseView<P extends BasePresenter<?>> implements IView<P>{
//presenter引用
P presenter;
}
這個代碼在Java中 沒有任何問題,但是轉Kotlin后,出現(xiàn)了意想不到的報錯。
interface IPresenter<V> {}
abstract class BasePresenter<V : BaseView<*>> : IPresenter<V> {
//View引用
lateinit var view : V
}
interface IView<P> {}
abstract class BaseView<P : BasePresenter<*>> : IView<P> {
//presenter引用
lateinit var presenter : P
}
報錯截圖如下:

泛型2.png

泛型1.png
錯誤大致意識是:類型不對,這。。。簡直離譜。
為什么Java可以,轉Kotlin居然報錯了。嘗試了很多種方案以后:
終于功夫不負有心人。給點耐心,終于解決了:代碼如下:
interface IPresenter<V> {}
abstract class BasePresenter<P : BasePresenter<P,V>,V : BaseView<V,P>> : IPresenter<V> {
//view引用
lateinit var view : V
}
interface IView<P> {}
abstract class BaseView<V: BaseView<V,P> ,P : BasePresenter<P,V>> : IView<P> {
//presenter引用
lateinit var presenter : P
}
大致思路就是為了防止無限制的互相引用泛型,直接把自己的類型也當作泛型。注意把自己當作泛型的類型時,需要放在泛型括號的前面。如果不理解,可以把代碼拷貝下去,自己動起手來,慢慢體會。