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 函数签名冲突相关推荐

  1. 在QT中使用socket编程:解决connect函数名称冲突

    问题 当使用QT做可视化界面的时候,我们知道connect函数是连接函数,用于连接信号与槽,但connect在C/C++的socket网络编程中也是一个必不可少的函数,作用是发送连接请求,建立tcp连 ...

  2. Android - 已安装了存在签名冲突的同名数据包,解决方法!

    错误提示:已安装了存在签名冲突的同名数据包. 解决方法:打开Android Studio,打开logcat,用usb线连接你出错的手机,识别出手机之后,在你的项目后面,点击"run" ...

  3. Android之手机出现已安装了存在签名冲突的同名数据包的原因及解决办法

    如果你不是开发者:如果你在android上更新一个已经安装过较早版本软件时,安装到最后一步提示你:已安装了存在签名冲突的同名数据包,然后安装失败.这是因为旧版软件的签名信息与新版不一致造成的.你可以卸 ...

  4. 出现已安装了存在签名冲突的同名数据包的原因及解决办法

    如果你在android上更新一个已经安装过较早版本软件时,安装到最后一步提示你:已安装了存在签名冲突的同名数据包,然后安装失败.这是因为旧版软件的签名信息与新版不一致造成的.你可以卸载这个软件,然后安 ...

  5. 安装APK时显示“已安装了签名冲突的应用”,但是手机上又没有该软件的解决办法

    事情是这样的,自己写了一个Android APP,生成安装包后,拷贝到手机上时,进行安装,发现安装不上,显示"已安装了签名冲突的应用".解决办法自然是先卸载该软件,就可以解决问题. ...

  6. ”该硬盘处于脱机.因为他与另一个联机磁盘发生签名冲突“的解决方法,有图有真相

    附:该问题有很简明的解决方法,地址如下 http://zhidao.baidu.com/question/182520280.html 没有原理方面的解说,但不影响操作,想深究的同学可以参考我的帖子, ...

  7. C++ 符号修饰和函数签名

    前言: (这部分讲的是历史.由来,不想了解的可跳过) 约在20世纪70年代以前,编译器编译源代码产生目标文件时,符号名与相应的变量和函数的名字是一样的.比如一个汇编源代码里面包含了一个函数foo,那么 ...

  8. C++符号修饰与函数签名

    很久以前在一个汇编源代码里包含一个函数foo,那么汇编器将它编译成目标文件以后,foo在目标文件中的相对应的符号名也是foo. 当后来Unix平台和C语言出现后,已经存在了相当多的汇编编写的库和目标文 ...

  9. Kotlin 函数的问题

    Kotlin 函数呢 需要先清楚Java的函数问题 java方法(函数)知识回顾 先写一个java的方法(函数) public void aMethod() {System.out.println(& ...

最新文章

  1. 如何在团队中做好Code Review
  2. 目录文件和根目录文件夹
  3. 正则表达式中^的用法
  4. PMCAFF高端俱乐部首次集结,最顶级产品人的私密俱乐部!
  5. DICOM:符号和缩写
  6. ueditor php版使用,ueditor 1.2.6 使用方法说明
  7. getchar()函数的一些知识
  8. shell脚本执行oracle删除表,shell脚本操作oracle删除表空间、创建表空间、删除用户...
  9. Java集合框架之三:HashMap源码解析
  10. 现在电脑的主流配置_主流级玩家 应该如何配置高性价比电脑
  11. (转)GB2312简体中文编码表
  12. php 统计fasta 序列长度和GC含量
  13. 2015年秋季腾讯校园招聘开发岗笔试题(四道大题)
  14. 80211速率控制的研究
  15. html网页中如何给文字加入下划线
  16. vue、html 实现头尾固定,中间滚动的布局(移动端常见的布局)
  17. 外卖系统外卖O2O系统开发功能与开发难点介绍
  18. 刘长炯老师的java 学习大草原
  19. TwinCAT3 编程字体设置
  20. 【MySQL基础】MySQL基本操作详解

热门文章

  1. 【32最小系统板】pid循迹小车(铁丝循迹)
  2. 计算机net是什么意思翻译,net是什么意思_net翻译_读音_用法_翻译
  3. 百度灵医智惠明星案例获人民日报点赞:智慧医疗让看病更便捷
  4. 银行板块行情发令枪已打响12月7日天弘中证银行ETF发售1天
  5. 数学建模进入“新课标”,告别了“刷题”“押题”数学应该怎么学?
  6. java获取下载链接文件流并上传至OSS
  7. 编译tensorflow遇见JVM out错误
  8. 天融信 还有什么型号服务器,天融信产品
  9. BNET通信区块链项目CEO刘建军受邀参加2018“区块链共识大会”
  10. 推荐几个字体生成网站