Android 運用@JvmName解決函數(shù)簽名沖突問題詳解
Kotlin(JVM) 中定義下面這樣兩個方函數(shù)時,編譯器會報錯
fun foo(value: List<String>) {} fun foo(value: List<Int>) {}
Platform declaration clash: The following declarations have the same JVM signature (method(Ljava/util/List;)V):
因為 Java 的泛型編譯期擦除,所以 JVM 無法識別簽名中泛型的區(qū)別,認為這兩個函數(shù)簽名沖突了
此時有一個小技巧是使用 @JvmName
規(guī)避這種沖突
@JvmName("fooB") fun foo(value: List<String>) {} @JvmName("fooA") fun foo(value: List<Int>) {}
@JvmName
會制定一個針對 JVM 的名字, 當我們分別指定了不同名字后, JVM 認為這是兩個不同的函數(shù),就不會報錯了
反編譯成 Java 代碼,相當于下面這樣
//Test.kt 是文件名 public final class TestKt { public static final void fooB(List<String> value) {} public static final void fooA(List<Integer> value) {} }
需要注意,這在 interface 中使用可能有限制
interface Test { @JvmName("fooB") fun foo(value: List<String>) { } @JvmName("fooA") fun foo(value: List<Int>) { } }
編譯器報錯如下:
@JvmName annotation is not applicable to this declaration
此時可以如下進行規(guī)避
interface Test { @Suppress("INAPPLICABLE_JVM_NAME") @JvmName("fooB") fun foo(value: List<String>) { } @Suppress("INAPPLICABLE_JVM_NAME") @JvmName("fooA") fun foo(value: List<Int>) { } }
@JvmName 本來是為了 Java 與 Kotlin 互操作性而生的注解,但是在 Kotlin 側(cè)單獨使用,也可以起到規(guī)避一些 JVM 限制的作用。有趣吧~
到此這篇關(guān)于Android 運用@JvmName解決函數(shù)簽名沖突問題詳解的文章就介紹到這了,更多相關(guān)Android @JvmName內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android ServiceManager的啟動和工作原理
這篇文章主要介紹了Android ServiceManager的啟動和工作原理,幫助大家更好的理解和學習使用Android開發(fā),感興趣的朋友可以了解下2021-03-03Android RecyclerView網(wǎng)格布局(支持多種分割線)詳解(2)
這篇文章主要為大家詳細介紹了Android RecyclerView網(wǎng)格布局,支持多種分割線,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02Android基于IJKPlayer視頻播放器簡單封裝設(shè)計
這篇文章主要介紹了Android基于IJKPlayer視頻播放器簡單封裝設(shè)計,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06Android設(shè)計模式之適配器(Adapter)模式
這篇文章主要介紹了Android設(shè)計模式之適配器(Adapter)模式,以源碼解析的方式分析適配器模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11Android采取ContentObserver方式自動獲取驗證碼
這篇文章主要為大家詳細介紹了Android采取ContentObserver方式自動獲取驗證碼,感興趣的小伙伴們可以參考一下2016-08-08代碼從windows下visual studio到andriod平臺遷移實現(xiàn)步驟
這篇文章主要介紹了代碼從windows下visual studio到andriod平臺遷移的修改記錄的相關(guān)資料,需要的朋友可以參考下2017-01-01基于android示例程序(bitmapfun) 高效加載圖片讓人無語地方
嘗試了使用git上的一個開源項目afinal(bitmapfun的封裝版)來加載圖片,但是在測試的時候發(fā)現(xiàn)了一個問題,新的圖片加載器(bitmapfun)比之前用的ImageDownloader要慢很多,特別是在網(wǎng)絡(luò)狀況不好的時候,那簡直是太讓人無語了2013-04-04