我很好奇为什么可以使用默认参数调用kotlin的构造函数而不是java代码中的方法?
例如:
class Test(val test: String = "")
Java客户端:
void test() {
new Test();
}
没关系。
但如果我想用方法做同样的技巧,那就不可能了:
class Test {
fun x(x: Int = 5) { }
}
Java客户端,编译错误:
void test() {
new Test().x();
}
在反编译到java字节码的方法中我看到了
X $默认
方法。它是静态的,我不能用java调用它(想法不允许我这样做)。而且只添加了
使用默认arg对kotlin方法的注释创建了另一个可以从java端访问的方法。@JvmOverloads
问题是为什么有两种方法如何从java调用kotlin的默认值?为什么不默认可以访问/无法访问?这是一个糟糕的设计还是有充分的理由这样做?
答案 0 :(得分:3)
我相信,当前设计背后的考虑因素是基于以下事实:类中存在默认(无参数)构造函数是JVM上广泛使用的约定:有许多依赖它的库和框架(例如依赖注入工具,JSR-305)。因此,当存在所有参数的默认值时,生成无参数构造函数支持这些用例,并且可能是用户期望的。
相反,函数通常没有所有参数的默认值,我认为Java世界中任何习惯用法都不需要它。此外,您可以在Kotlin类中预期许多具有默认值的函数,并且默认情况下为它们生成重载将导致不合需要的方法计数增长,这对于Android尤其重要。