在使用Kotlin重構(gòu)原來(lái)的Java項(xiàng)目時(shí),Base類(lèi)中Java的泛型,轉(zhuǎn)Kotlin竟然報(bào)錯(cuò)了,下面看一段偽代碼
//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;
}
這個(gè)代碼在Java中 沒(méi)有任何問(wèn)題,但是轉(zhuǎn)Kotlin后,出現(xiàn)了意想不到的報(bào)錯(cuò)。
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
}
報(bào)錯(cuò)截圖如下:

泛型2.png

泛型1.png
錯(cuò)誤大致意識(shí)是:類(lèi)型不對(duì),這。。。簡(jiǎn)直離譜。
為什么Java可以,轉(zhuǎn)Kotlin居然報(bào)錯(cuò)了。嘗試了很多種方案以后:
終于功夫不負(fù)有心人。給點(diǎn)耐心,終于解決了:代碼如下:
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
}
大致思路就是為了防止無(wú)限制的互相引用泛型,直接把自己的類(lèi)型也當(dāng)作泛型。注意把自己當(dāng)作泛型的類(lèi)型時(shí),需要放在泛型括號(hào)的前面。如果不理解,可以把代碼拷貝下去,自己動(dòng)起手來(lái),慢慢體會(huì)。