为什么Kotlin与Java互操作支持默认参数但不支持命名参数?
问题核心原因
命名参数是Kotlin独有的语法特性,Java语言本身从设计层面就不支持该语法,和Kotlin侧是否添加@JvmOverloads注解没有关联。
具体原理说明
@JvmOverloads的作用仅为适配Java的重载机制:Kotlin编译器在编译带默认参数的函数时,若加了该注解,会自动生成对应参数数量的Java兼容重载方法,你示例中的findVolume函数会被编译生成2个Java可调用的重载:- 3个参数版本:
int findVolume(int length, int breadth, int height) - 2个参数版本:
int findVolume(int length, int breadth)(内部自动填充height的默认值20)
你在Java中传2个参数可正常运行,本质是匹配到了自动生成的2参数重载,走的是Java原生的重载匹配逻辑,并非Java识别了Kotlin的默认参数。
- 3个参数版本:
- Java目前所有正式版本(截至JDK21)均未纳入命名参数语法规范,Java编译器完全不识别
参数名=参数值的调用写法,无论你调用的是Java原生方法还是Kotlin编译生成的方法,只要在Java代码中写这种格式,编译阶段就会直接抛出语法错误,和方法的实现来源无关。
替代方案
如果需要在Java调用时明确参数含义,仅能添加注释做标识,写法如下:
KotlingFileName.findVolume(/* length */5, /* breadth */ 10);
该注释仅给开发者阅读,不会参与编译逻辑。
内容的提问来源于stack exchange,提问作者shaby
相关产品推荐
相关产品推荐

