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后,出現(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
}

大致思路就是為了防止無限制的互相引用泛型,直接把自己的類型也當作泛型。注意把自己當作泛型的類型時,需要放在泛型括號的前面。如果不理解,可以把代碼拷貝下去,自己動起手來,慢慢體會。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 泛型產(chǎn)生 Java泛型是JDK1.5引入的一個新特性,是一種參數(shù)化類型。參數(shù)化類型就是在不創(chuàng)建新類型的情況下,通過...
    kevinsEegets閱讀 792評論 3 1
  • 建議先閱讀我的上一篇文章 -- Java 泛型 和 Java 泛型一樣,Kotlin 泛型也是 Kotlin 語言...
    JohnnyShieh閱讀 6,638評論 1 26
  • 正文 本文主要列舉Java泛型與Kotlin泛型的基本知識,以及兩者的區(qū)別。 什么泛型 泛型程序設計是程序設計的一...
    珠穆朗瑪小王子閱讀 607評論 0 1
  • Java為什么引入泛型 眾所周知,Java 5才最大的亮點就是引入泛型,那么Java引入泛型的目的是什么?這就需要...
    大棋17閱讀 1,932評論 0 3
  • 什么是泛型? 泛型是一種參數(shù)化類型,將操作的數(shù)據(jù)類型(非基本類型)作為一個參數(shù),這種參數(shù)類型可以在類、接口、方法中...
    isLJli閱讀 432評論 0 2

友情鏈接更多精彩內容