Kotlin @JvmOverLoads 笔记

@JvmOverloads 是 Kotlin 中的一个注解,用于指示编译器为带有默认参数值的函数或构造函数生成多个 Java 重载方法(overloads)。这样,在 Java 代码中调用 Kotlin 函数时,可以像调用普通 Java 重载方法一样,省略某些参数,让编译器自动选择对应的重载版本。

作用

  • 为 Kotlin 函数生成多个重载 :当一个 Kotlin 函数定义了默认参数时,从 Java 调用时所有参数都必须显式传递,因为 Java 不支持默认参数。使用 @JvmOverloads 后,编译器会生成一系列重载方法,每个重载依次省略一个参数(从最后一个开始),直到所有参数都有默认值的版本。这使得 Java 调用者可以像调用重载方法一样,只传递必要的参数。
  • 为构造函数生成重载:同样可用于类的构造函数(包括主构造函数和次构造函数),让 Java 代码能够以不同参数个数实例化对象。

示例

Kotlin 代码

kotlin 复制代码
class Person @JvmOverloads constructor(
    val name: String,
    val age: Int = 0,
    val email: String? = null
)

@JvmOverloads
fun greet(name: String, times: Int = 1, prefix: String = "Hello") {
    repeat(times) {
        println("$prefix, $name!")
    }
}

生成的 Java 等价代码(简化)

java 复制代码
// 对应构造函数
public Person(String name) { ... }
public Person(String name, int age) { ... }
public Person(String name, int age, String email) { ... }

// 对应函数
public void greet(String name) { ... }
public void greet(String name, int times) { ... }
public void greet(String name, int times, String prefix) { ... }

注意事项

  • 仅对默认参数生效:只有拥有默认值的参数才会参与生成重载。
  • 生成的顺序:重载方法按参数数量递减生成,最后一个参数是拥有默认值的参数开始逐个省略。
  • Java 调用体验@JvmOverloads 可以显著改善 Kotlin 代码在 Java 中的互操作性,让 Java 开发者不必为每个参数提供值。
  • 可与 @JvmStatic 等组合使用:用于静态方法或伴生对象中时,需结合其他注解。

简言之,@JvmOverloads 是 Kotlin 为 Java 互操作性提供的实用注解,让 Kotlin 的默认参数特性在 Java 世界中也能够方便地使用。

相关推荐
杊页几秒前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·操作系统
故渊at1 分钟前
第十二板块:Android 系统启动与初始化 | 第三十篇:Zygote 孵化机制与 System Server 的启动
android·wms·pms·ams·zygote·ipc
故渊at22 分钟前
第十二板块:Android 系统启动与初始化 | 第二十九篇:Init 进程、RC 脚本与属性服务(Property Service)
android·linux·内存映射·权限控制·init进程·rc脚本·属性服务
故渊at26 分钟前
第十三板块:Android 综合架构与未来演进 | 第三十二篇:Android 内存管理与 LMK 机制的深度剖析
android·架构·内存管理·内存回收·lmk机制·收割算法
故渊at27 分钟前
第十一板块:Android 跨进程通信与 Binder 深度剖析 | 第二十七篇:Binder 线程池与死亡通知(Death Recipient)机制
android·binder·线程池·死亡通知·跨进程通讯
jushi899927 分钟前
FB Neo 街机模拟器全游戏整合版 含25000+街机游戏怀旧复古街机游戏 解压即玩 热门怀旧街机游戏全集安卓+PC电脑版
android·游戏·电脑
vensli29 分钟前
体验专题——Android 应用瘦身实战
android·网络
AFinalStone29 分钟前
Android12 U盘插拔链路源码全解析(七):应用层 —— MediaScanner与SAF
android·frameworks
AI玫瑰助手1 小时前
Python模块:import导入模块与模块的搜索路径
android·开发语言·python
yewq-cn1 小时前
Android Log System
android