巧用 @JvmName 解决 Kotlin 函数签名冲突
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 限制的作用。有趣吧~
巧用 @JvmName 解决 Kotlin 函数签名冲突相关推荐
- 在QT中使用socket编程:解决connect函数名称冲突
问题 当使用QT做可视化界面的时候,我们知道connect函数是连接函数,用于连接信号与槽,但connect在C/C++的socket网络编程中也是一个必不可少的函数,作用是发送连接请求,建立tcp连 ...
- Android - 已安装了存在签名冲突的同名数据包,解决方法!
错误提示:已安装了存在签名冲突的同名数据包. 解决方法:打开Android Studio,打开logcat,用usb线连接你出错的手机,识别出手机之后,在你的项目后面,点击"run" ...
- Android之手机出现已安装了存在签名冲突的同名数据包的原因及解决办法
如果你不是开发者:如果你在android上更新一个已经安装过较早版本软件时,安装到最后一步提示你:已安装了存在签名冲突的同名数据包,然后安装失败.这是因为旧版软件的签名信息与新版不一致造成的.你可以卸 ...
- 出现已安装了存在签名冲突的同名数据包的原因及解决办法
如果你在android上更新一个已经安装过较早版本软件时,安装到最后一步提示你:已安装了存在签名冲突的同名数据包,然后安装失败.这是因为旧版软件的签名信息与新版不一致造成的.你可以卸载这个软件,然后安 ...
- 安装APK时显示“已安装了签名冲突的应用”,但是手机上又没有该软件的解决办法
事情是这样的,自己写了一个Android APP,生成安装包后,拷贝到手机上时,进行安装,发现安装不上,显示"已安装了签名冲突的应用".解决办法自然是先卸载该软件,就可以解决问题. ...
- ”该硬盘处于脱机.因为他与另一个联机磁盘发生签名冲突“的解决方法,有图有真相
附:该问题有很简明的解决方法,地址如下 http://zhidao.baidu.com/question/182520280.html 没有原理方面的解说,但不影响操作,想深究的同学可以参考我的帖子, ...
- C++ 符号修饰和函数签名
前言: (这部分讲的是历史.由来,不想了解的可跳过) 约在20世纪70年代以前,编译器编译源代码产生目标文件时,符号名与相应的变量和函数的名字是一样的.比如一个汇编源代码里面包含了一个函数foo,那么 ...
- C++符号修饰与函数签名
很久以前在一个汇编源代码里包含一个函数foo,那么汇编器将它编译成目标文件以后,foo在目标文件中的相对应的符号名也是foo. 当后来Unix平台和C语言出现后,已经存在了相当多的汇编编写的库和目标文 ...
- Kotlin 函数的问题
Kotlin 函数呢 需要先清楚Java的函数问题 java方法(函数)知识回顾 先写一个java的方法(函数) public void aMethod() {System.out.println(& ...
最新文章
- 如何在团队中做好Code Review
- 目录文件和根目录文件夹
- 正则表达式中^的用法
- PMCAFF高端俱乐部首次集结,最顶级产品人的私密俱乐部!
- DICOM:符号和缩写
- ueditor php版使用,ueditor 1.2.6 使用方法说明
- getchar()函数的一些知识
- shell脚本执行oracle删除表,shell脚本操作oracle删除表空间、创建表空间、删除用户...
- Java集合框架之三:HashMap源码解析
- 现在电脑的主流配置_主流级玩家 应该如何配置高性价比电脑
- (转)GB2312简体中文编码表
- php 统计fasta 序列长度和GC含量
- 2015年秋季腾讯校园招聘开发岗笔试题(四道大题)
- 80211速率控制的研究
- html网页中如何给文字加入下划线
- vue、html 实现头尾固定,中间滚动的布局(移动端常见的布局)
- 外卖系统外卖O2O系统开发功能与开发难点介绍
- 刘长炯老师的java 学习大草原
- TwinCAT3 编程字体设置
- 【MySQL基础】MySQL基本操作详解
热门文章
- 【32最小系统板】pid循迹小车(铁丝循迹)
- 计算机net是什么意思翻译,net是什么意思_net翻译_读音_用法_翻译
- 百度灵医智惠明星案例获人民日报点赞:智慧医疗让看病更便捷
- 银行板块行情发令枪已打响12月7日天弘中证银行ETF发售1天
- 数学建模进入“新课标”,告别了“刷题”“押题”数学应该怎么学?
- java获取下载链接文件流并上传至OSS
- 编译tensorflow遇见JVM out错误
- 天融信 还有什么型号服务器,天融信产品
- BNET通信区块链项目CEO刘建军受邀参加2018“区块链共识大会”
- 推荐几个字体生成网站