Android运用@JvmName解决函数签名冲突问题详解 Kotlin(JVM) 中定义下面这样两个方函数时,编译器会报错 fun foo(value: ListString) {} fun foo(value: ListInt) {} Platform declaration clash: The following declarations have the same JVM signature (method(Ljava/util/List;)V): 因为 Java 的泛型编译
Kotlin(JVM) 中定义下面这样两个方函数时,编译器会报错
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 无法识别签名中泛型的区别,认为这两个函数签名冲突了
此时有一个小技巧是使用 @JvmName
规避这种冲突
@JvmName("fooB")
fun foo(value: List<String>) {}
@JvmName("fooA")
fun foo(value: List<Int>) {}
@JvmName
会制定一个针对 JVM 的名字, 当我们分别指定了不同名字后, JVM 认为这是两个不同的函数,就不会报错了
反编译成 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
此时可以如下进行规避
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 侧单独使用,也可以起到规避一些 JVM 限制的作用。有趣吧~
到此这篇关于Android 运用@JvmName解决函数签名冲突问题详解的文章就介绍到这了,更多相关Android @JvmName内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
本文标题为:Android 运用@JvmName解决函数签名冲突问题详解
基础教程推荐
- Android实现短信验证码输入框 2023-04-29
- iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi 2023-06-18
- IOS获取系统相册中照片的示例代码 2023-01-03
- Android开发Compose集成高德地图实例 2023-06-15
- iOS开发 全机型适配解决方法 2023-01-14
- Flutter进阶之实现动画效果(三) 2022-10-28
- iOS开发使用XML解析网络数据 2022-11-12
- Android Compose自定义TextField实现自定义的输入框 2023-05-13
- MVVMLight项目Model View结构及全局视图模型注入器 2023-05-07
- iOS Crash常规跟踪方法及Bugly集成运用详细介绍 2023-01-18