我很好奇为什么可以使用默认参数调用 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$default
方法。它是静态的,我不能从 java 中调用它(idea 不允许我这样做)。并且只添加
@JvmOverloads
使用默认 arg 对 kotlin 方法的注释创建了一个可以从 java 端访问的方法。
问题是为什么有两种方法可以从 java 调用 kotlin 的默认值?为什么不默认做所有可访问/不可访问的事情?这是一个糟糕的设计还是有充分的理由这样做?
最佳答案
我相信,当前设计背后的考虑是基于这样一个事实,即类中存在默认(无参数)构造函数是 JVM 上广泛使用的约定:有许多依赖它的库和框架(例如依赖注入(inject)工具,JSR-305)。因此,在所有参数都有默认值时生成无参数构造函数支持这些用例,并且可能是用户所期望的。
相反,函数通常没有所有参数的默认值,我认为 Java 世界中的任何习语都不需要它。此外,您可以预期 Kotlin 类中有许多具有默认值的函数,默认情况下为它们生成重载会导致不希望的方法数量增长,这对 Android 尤为重要。
关于java - 为什么可以使用默认参数而不是方法调用 kotlin 的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48531600/