在使用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后,出现了意想不到的报错。
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
}
报错截图如下:
错误大致意识是:类型不对,这。。。简直离谱。
为什么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
}
大致思路就是为了防止无限制的互相引用泛型,直接把自己的类型也当作泛型。注意把自己当作泛型的类型时,需要放在泛型括号的前面。如果不理解,可以把代码拷贝下去,自己动起手来,慢慢体会。