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 側單獨使用,也可以起到規(guī)避一些 JVM 限制的作用。有趣吧~
到此這篇關于Android 運用@JvmName解決函數(shù)簽名沖突問題詳解的文章就介紹到這了,更多相關Android @JvmName內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android中使用imageviewswitcher 實現(xiàn)圖片切換輪播導航的方法
ImageSwitcher是Android中控制圖片展示效果的一個控件。本文給大家介紹Android中使用imageviewswitcher 實現(xiàn)圖片切換輪播導航的方法,需要的朋友參考下吧2016-12-12
Android開發(fā)基于ViewPager+GridView實現(xiàn)仿大眾點評橫向滑動功能
這篇文章主要介紹了Android開發(fā)基于ViewPager+GridView實現(xiàn)仿大眾點評橫向滑動功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09

