我的Kotlin文件:
class Chat(var name: String, var age: Int? = 18)
java文件只能做到这一点:
new Chat("John",18);
但我可以写这个吗?
new Chat("John");
zbdgwd5y1#
来自Kotlin文档:通常情况下,如果您使用默认参数值编写一个Kotlin方法,则它在Java中仅作为完整签名可见,并且所有参数都存在。如果希望向Java调用方公开多个重载,可以使用@JvmOverloads注解。所以,如果你只想在Java中用name初始化Chat,你必须在构造函数中添加@JvmOverloads注解。
name
Chat
@JvmOverloads
class Chat @JvmOverloads constructor(var name: String, var age: Int? = 18)
它将为每个具有默认值的参数生成额外的重载。
public Chat(String name) {}public Chat(String name, Integer age) {}
public Chat(String name) {}
public Chat(String name, Integer age) {}
jfgube3f2#
公认的答案是正确的,但我想指出一件事-如果所有的构造函数参数都是可选的,那么将生成没有参数的构造函数,因此您不需要@JvmOverloads。例如,如果你在Kotlin中有:
class MyEntity(var name: String = "alex", var age: Int = 18)
那么在Java字节码中,你将有一个all args构造函数,以及no-args构造函数,因此你将能够在Java中做这两件事:
new MyEntity(); // no argsnew MyEntity("custom name", 24); // all args
new MyEntity(); // no args
new MyEntity("custom name", 24); // all args
没有任何额外的注解
2条答案
按热度按时间zbdgwd5y1#
来自Kotlin文档:
通常情况下,如果您使用默认参数值编写一个Kotlin方法,则它在Java中仅作为完整签名可见,并且所有参数都存在。如果希望向Java调用方公开多个重载,可以使用@JvmOverloads注解。
所以,如果你只想在Java中用
name
初始化Chat
,你必须在构造函数中添加@JvmOverloads
注解。它将为每个具有默认值的参数生成额外的重载。
jfgube3f2#
公认的答案是正确的,但我想指出一件事-如果所有的构造函数参数都是可选的,那么将生成没有参数的构造函数,因此您不需要
@JvmOverloads
。例如,如果你在Kotlin中有:
那么在Java字节码中,你将有一个all args构造函数,以及no-args构造函数,因此你将能够在Java中做这两件事:
没有任何额外的注解