Android 运用@JvmName解决函数签名冲突问题详解
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 ServiceManager的启动和工作原理
这篇文章主要介绍了Android ServiceManager的启动和工作原理,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下2021-03-03Android RecyclerView网格布局(支持多种分割线)详解(2)
这篇文章主要为大家详细介绍了Android RecyclerView网格布局,支持多种分割线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-02-02Android采取ContentObserver方式自动获取验证码
这篇文章主要为大家详细介绍了Android采取ContentObserver方式自动获取验证码,感兴趣的小伙伴们可以参考一下2016-08-08代码从windows下visual studio到andriod平台迁移实现步骤
这篇文章主要介绍了代码从windows下visual studio到andriod平台迁移的修改记录的相关资料,需要的朋友可以参考下2017-01-01基于android示例程序(bitmapfun) 高效加载图片让人无语地方
尝试了使用git上的一个开源项目afinal(bitmapfun的封装版)来加载图片,但是在测试的时候发现了一个问题,新的图片加载器(bitmapfun)比之前用的ImageDownloader要慢很多,特别是在网络状况不好的时候,那简直是太让人无语了2013-04-04
最新评论