Android 运用@JvmName解决函数签名冲突问题详解

 更新时间:2022年07月22日 15:14:27   作者:fundroid_方卓  
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 限制的作用。有趣吧~

到此这篇关于Android 运用@JvmName解决函数签名冲突问题详解的文章就介绍到这了,更多相关Android @JvmName内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android视频压缩的示例代码

    Android视频压缩的示例代码

    本篇文章主要介绍了Android视频压缩的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Android 利用方向传感器实现指南针具体步骤

    Android 利用方向传感器实现指南针具体步骤

    Android利用方向传感器实现指南针功能,听起来还不错吧,下面与大家分享下具体的实现步骤,感兴趣的朋友可以参考下哈
    2013-06-06
  • Android实现每天定时提醒功能

    Android实现每天定时提醒功能

    本文主要介绍了Android每天定时提醒功能、定时功能、闹钟的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-04-04
  • Android对话框AlertDialog详解

    Android对话框AlertDialog详解

    本文详细讲解了Android对话框AlertDialog的实现方式,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Android笔记整理之常见错误及解决方案汇总

    Android笔记整理之常见错误及解决方案汇总

    本文是小编日常整理的笔记关于android常见的错误及解决方案,本文对大家学习android相关知识非常有帮助,遇到问题能够很好的定位问题解决问题,感兴趣的朋友了解了解吧
    2015-11-11
  • Android给通知channel静音的方法实例

    Android给通知channel静音的方法实例

    这篇文章主要给大家介绍了关于Android如何给通知channel静音的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Android实现仿今日头条点赞动画效果实例

    Android实现仿今日头条点赞动画效果实例

    我想看到今日头条的点赞效果,应该都觉得很绚丽吧,下面这篇文章主要给大家介绍了关于Android实现仿今日头条点赞动画效果的相关资料,文中通过示例代价介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 谈谈Android里的Context的使用实例

    谈谈Android里的Context的使用实例

    这篇文章主要介绍了谈谈Android里的Context的使用实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-11-11
  • 详解Android中visibility属性VISIBLE、INVISIBLE、GONE的区别

    详解Android中visibility属性VISIBLE、INVISIBLE、GONE的区别

    在Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”、“invisible”、“gone”。主要用来设置控制控件的显示和隐藏。本文就详细的讲解一下。
    2016-12-12
  • Android选择图片或拍照图片上传到服务器

    Android选择图片或拍照图片上传到服务器

    这篇文章主要为大家详细介绍了android选择图片或拍照图片上传到服务器的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01

最新评论