当前位置: 首页 > news >正文

Kotlin 与 Java 互操作中常用注解

以下是 Kotlin 与 Java 互操作中常用注解的详细说明,涵盖其作用、使用场景及注意事项:


一、参数与方法适配类注解

1. @JvmOverloads
  • 作用​:为带默认参数的 Kotlin 函数生成 Java 兼容的重载方法。

  • 使用场景​:需从 Java 调用 Kotlin 默认参数方法时。

  • 示例​:

    @JvmOverloads
    fun greet(name: String = "World") {println("Hello, $name!")
    }

    生成 Java 重载:

    greet();        // 调用 greet("")
    greet("Alice"); // 调用 greet("Alice")
  • 限制​:不可用于扩展函数或 vararg参数。

2. @JvmName
  • 作用​:修改 Kotlin 元素(函数、类、属性)在 Java 中的名称。

  • 使用场景​:

    • 解决 Kotlin 特殊字符(如 ?)与 Java 命名规范冲突。

    • 避免同名方法冲突。

  • 示例​:

    @file:JvmName("StringUtils") // 修改文件生成类名
    package com.example
    fun isNullOrEmpty(str: String?): Boolean = str.isNullOrEmpty()

    Java 调用:StringUtils.isNullOrEmpty("")


二、属性与字段适配类注解

1. @JvmField
  • 作用​:将 Kotlin 属性直接暴露为 Java 公共字段,跳过 getter/setter。

  • 使用场景​:性能敏感场景或需与 Java 反射库(如 Gson)集成。

  • 示例​:

    class User {@JvmField val name: String = "Alice"
    }

    Java 直接访问:user.name

  • 限制​:不可用于私有属性或 var变量。

2. @JvmStatic
  • 作用​:将伴生对象或对象声明的成员暴露为 Java 静态成员。

  • 使用场景​:需从 Java 以静态方式调用 Kotlin 伴生对象方法。

  • 示例​:

    class Config {companion object {@JvmStatic val API_KEY = "12345"}
    }

    Java 调用:Config.API_KEY


三、异常与类型安全类注解

1. @Throws
  • 作用​:声明 Kotlin 方法可能抛出的异常,强制 Java 调用者处理。

  • 使用场景​:Kotlin 抛出受检异常(如 IOException)时。

  • 示例​:

    @Throws(IOException::class)
    fun readFile(path: String) {throw IOException("File not found")
    }

    Java 需添加 try-catch

2. @JvmSuppressWildcards
  • 作用​:禁止 Kotlin 泛型类型参数在 Java 中被转换为通配符(?)。

  • 使用场景​:需严格保持泛型类型不变的场景(如序列化)。

  • 示例​:

    fun processList(@JvmSuppressWildcards list: List<String>) { ... }

    Java 无法传入 List<?>


四、文件与包级配置注解

1. @file:JvmName
  • 作用​:修改 Kotlin 文件编译生成的 Java 类名。

  • 示例​:

    @file:JvmName("MathUtils")
    package com.example
    fun add(a: Int, b: Int): Int = a + b

    Java 调用:MathUtils.add(1, 2)

2. @file:JvmMultifileClass
  • 作用​:将多个 Kotlin 文件合并到同一个 Java 类中。

  • 使用场景​:拆分大型工具类为多个文件。

  • 示例​:

    // File1.kt
    @file:JvmName("Utils")
    @file:JvmMultifileClass
    fun func1() { ... }// File2.kt
    @file:JvmName("Utils")
    @file:JvmMultifileClass
    fun func2() { ... }

    Java 调用:Utils.func1()Utils.func2()


五、其他实用注解

1. @Synchronized
  • 作用​:将方法标记为同步方法,等效于 Java 的 synchronized关键字。

  • 示例​:

    @Synchronized
    fun incrementCounter() { ... }

    确保多线程安全。

2. @Volatile
  • 作用​:标记属性为易变,确保多线程可见性。

  • 示例​:

    @Volatile
    var isRunning = true

    避免指令重排序问题。


📝 ​总结

注解

核心用途

典型场景

@JvmOverloads

生成默认参数重载方法

Java 调用 Kotlin 默认参数函数

@JvmName

修改元素在 Java 中的名称

解决命名冲突或规范适配

@JvmField

暴露属性为 Java 字段

性能优化或与反射库集成

@JvmStatic

暴露伴生对象成员为静态方法

Java 静态调用伴生对象方法

@Throws

声明受检异常

Kotlin 抛出 Java 受检异常

注意事项​:

  • 避免滥用 @JvmField破坏封装性。

  • @JvmOverloads可能生成冗余重载,需权衡 API 复杂度。

  • 泛型相关注解(如 @JvmSuppressWildcards)需谨慎处理类型擦除问题。

http://www.dtcms.com/a/499729.html

相关文章:

  • 计算机操作系统:程序的装入与链接
  • 怎么建设网站手机网站制作价格在线考试类网站怎么做
  • 3.1 栈
  • 国贸网站建设公司服务专业的网站建站公司
  • 手写观察者模式:原理、实现与应用
  • 商贸有限公司网站案例wordpress模版安装
  • Rclone、rsync、Docker 的 COPY/ADD:路径末尾加不加「/」的含义大不相同!
  • 【复习】计网每日一题1016--可分配
  • 【STM32】hal库 多通道ADC(+DMA)采集 连续模式
  • 网站收录量是什么意思开网站卖茶要怎么做
  • 软著下证又又+1
  • 常见分析方法与对应图表汇总
  • 【图像处理】常见图像插值算法与应用
  • Python爬虫入门:从零到数据采集
  • 免费创建app网站网站推广的基本方法是哪四个
  • 建设网站需要的资金清单建设银行网站会员怎么用
  • 深度学习——YOLO 原理与各版本演化
  • 实验室安全准入考试答案
  • 设计网络网站郑州专业公司网站建设公司
  • 17做网店一样的网站html投票代码
  • 网站建设与维护薪资网页版梦幻西游答题器
  • Form表单._表单元素(本文为个人学习笔记,内容整理自哔哩哔哩UP主【非学者勿扰】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
  • 合肥企业做网站wap游戏中心
  • React 02
  • 营销网站定制深圳设计展2022
  • MPLS技术详解3:LDP实验与配置实践
  • 上海网站seo设计百度地图电脑版网页
  • 建设 政务数据共享网站网页搜索功能怎么实现
  • 手写Spring第4弹: Spring框架进化论:15年技术变迁:从XML配置到响应式编程的演进之路
  • [优选算法专题四.前缀和——NO.26二维前缀和]