Android 運(yùn)用@JvmName解決函數(shù)簽名沖突問(wèn)題詳解
Kotlin(JVM) 中定義下面這樣兩個(gè)方函數(shù)時(shí),編譯器會(huì)報(bào)錯(cuò)
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):
因?yàn)?Java 的泛型編譯期擦除,所以 JVM 無(wú)法識(shí)別簽名中泛型的區(qū)別,認(rèn)為這兩個(gè)函數(shù)簽名沖突了
此時(shí)有一個(gè)小技巧是使用 @JvmName
規(guī)避這種沖突
@JvmName("fooB") fun foo(value: List<String>) {} @JvmName("fooA") fun foo(value: List<Int>) {}
@JvmName
會(huì)制定一個(gè)針對(duì) JVM 的名字, 當(dāng)我們分別指定了不同名字后, JVM 認(rèn)為這是兩個(gè)不同的函數(shù),就不會(huì)報(bào)錯(cuò)了
反編譯成 Java 代碼,相當(dāng)于下面這樣
//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>) { } }
編譯器報(bào)錯(cuò)如下:
@JvmName annotation is not applicable to this declaration
此時(shí)可以如下進(jìn)行規(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 本來(lái)是為了 Java 與 Kotlin 互操作性而生的注解,但是在 Kotlin 側(cè)單獨(dú)使用,也可以起到規(guī)避一些 JVM 限制的作用。有趣吧~
到此這篇關(guān)于Android 運(yùn)用@JvmName解決函數(shù)簽名沖突問(wèn)題詳解的文章就介紹到這了,更多相關(guān)Android @JvmName內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android開(kāi)發(fā)簽名知識(shí)梳理總結(jié)
- Android studio導(dǎo)出APP測(cè)試包和構(gòu)建正式簽名包
- Android Studio簽名打包的兩種方式(圖文教程)
- Android實(shí)現(xiàn)簽名涂鴉手寫(xiě)板
- Android 自定義View手寫(xiě)簽名并保存圖片功能
- Android studio設(shè)置指定的簽名文件教程
- Android 項(xiàng)目正式簽名打包教程分享
- Android系統(tǒng)制作自定義簽名的例子
- 使用Android Studio實(shí)現(xiàn)為系統(tǒng)級(jí)的app簽名
相關(guān)文章
微信公眾平臺(tái)開(kāi)發(fā)入門(mén)教程(SAE方倍工作室)
在這篇微信公眾平臺(tái)開(kāi)發(fā)教程中,我們假定你已經(jīng)有了PHP語(yǔ)言程序、MySQL數(shù)據(jù)庫(kù)、計(jì)算機(jī)網(wǎng)絡(luò)通訊、及HTTP/XML/CSS/JS等基礎(chǔ)2014-05-05Android ServiceManager的啟動(dòng)和工作原理
這篇文章主要介紹了Android ServiceManager的啟動(dòng)和工作原理,幫助大家更好的理解和學(xué)習(xí)使用Android開(kāi)發(fā),感興趣的朋友可以了解下2021-03-03Android編程開(kāi)發(fā)之Spinner組件用法
這篇文章主要介紹了Android編程開(kāi)發(fā)之Spinner組件用法,結(jié)合實(shí)例形式分析介紹了Android中Spinner組件的功能、定義及具體使用技巧,需要的朋友可以參考下2015-12-12Android RecyclerView網(wǎng)格布局(支持多種分割線)詳解(2)
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView網(wǎng)格布局,支持多種分割線,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Android基于IJKPlayer視頻播放器簡(jiǎn)單封裝設(shè)計(jì)
這篇文章主要介紹了Android基于IJKPlayer視頻播放器簡(jiǎn)單封裝設(shè)計(jì),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Android設(shè)計(jì)模式之適配器(Adapter)模式
這篇文章主要介紹了Android設(shè)計(jì)模式之適配器(Adapter)模式,以源碼解析的方式分析適配器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android采取ContentObserver方式自動(dòng)獲取驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了Android采取ContentObserver方式自動(dòng)獲取驗(yàn)證碼,感興趣的小伙伴們可以參考一下2016-08-08代碼從windows下visual studio到andriod平臺(tái)遷移實(shí)現(xiàn)步驟
這篇文章主要介紹了代碼從windows下visual studio到andriod平臺(tái)遷移的修改記錄的相關(guān)資料,需要的朋友可以參考下2017-01-01Kotlin設(shè)計(jì)模式之委托模式使用方法詳解
Kotlin提供了兩個(gè)本機(jī)功能來(lái)實(shí)現(xiàn)委托模式,第一個(gè)是接口委托(例如策略模式),另一種是屬性委托,它專注于類成員/屬性(例如延遲加載、observable等),它們共同提供了一組豐富而簡(jiǎn)潔的功能,通過(guò)本博客,您將了解在什么情況下使用此模式2023-09-09基于android示例程序(bitmapfun) 高效加載圖片讓人無(wú)語(yǔ)地方
嘗試了使用git上的一個(gè)開(kāi)源項(xiàng)目afinal(bitmapfun的封裝版)來(lái)加載圖片,但是在測(cè)試的時(shí)候發(fā)現(xiàn)了一個(gè)問(wèn)題,新的圖片加載器(bitmapfun)比之前用的ImageDownloader要慢很多,特別是在網(wǎng)絡(luò)狀況不好的時(shí)候,那簡(jiǎn)直是太讓人無(wú)語(yǔ)了2013-04-04