最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 運用@JvmName解決函數(shù)簽名沖突問題詳解

 更新時間:2022年07月22日 15:14:27   作者:fundroid_方卓  
JvmName注解是Kotlin提供的一個可以變更編譯器輸出的注解,這里簡單的介紹一下其使用規(guī)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

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 的名字, 當(dāng)我們分別指定了不同名字后, JVM 認為這是兩個不同的函數(shù),就不會報錯了

反編譯成 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>) {
    }
}

編譯器報錯如下:

@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)文章

最新評論

松阳县| 达孜县| 通州市| 新密市| 上林县| 巍山| 三亚市| 大宁县| 抚顺县| 宁安市| 曲沃县| 大化| 锡林郭勒盟| 临沧市| 彭州市| 固始县| 龙陵县| 昌邑市| 交城县| 小金县| 襄城县| 江孜县| 康乐县| 嵩明县| 马龙县| 阿拉善左旗| 赣榆县| 大关县| 长治县| 华蓥市| 广宗县| 双峰县| 荣成市| 富裕县| 隆安县| 玉门市| 仪征市| 凤山县| 东乡县| 祥云县| 山东省|