日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Android?運(yùn)用@JvmName解決函數(shù)簽名沖突問(wèn)題詳解_Android

作者:fundroid_方卓 ? 更新時(shí)間: 2022-09-16 編程語(yǔ)言

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 限制的作用。有趣吧~

原文鏈接:https://blog.csdn.net/vitaviva/article/details/123431203

欄目分類
最近更新