Java中泛型转Kotlin报错

在使用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
}

报错截图如下:


泛型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
}

大致思路就是为了防止无限制的互相引用泛型,直接把自己的类型也当作泛型。注意把自己当作泛型的类型时,需要放在泛型括号的前面。如果不理解,可以把代码拷贝下去,自己动起手来,慢慢体会。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 泛型产生 Java泛型是JDK1.5引入的一个新特性,是一种参数化类型。参数化类型就是在不创建新类型的情况下,通过...
    kevinsEegets阅读 617评论 3 1
  • 建议先阅读我的上一篇文章 -- Java 泛型 和 Java 泛型一样,Kotlin 泛型也是 Kotlin 语言...
    JohnnyShieh阅读 6,516评论 1 26
  • 正文 本文主要列举Java泛型与Kotlin泛型的基本知识,以及两者的区别。 什么泛型 泛型程序设计是程序设计的一...
    珠穆朗玛小王子阅读 533评论 0 1
  • Java为什么引入泛型 众所周知,Java 5才最大的亮点就是引入泛型,那么Java引入泛型的目的是什么?这就需要...
    大棋17阅读 1,777评论 0 3
  • 什么是泛型? 泛型是一种参数化类型,将操作的数据类型(非基本类型)作为一个参数,这种参数类型可以在类、接口、方法中...
    isLJli阅读 314评论 0 2