为什么有可能调用kotlin的构造函数的默认参数,但不是一个方法?
我很好奇为什么有可能调用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调用它(想法不允许我这样做)。 而且只有添加了
@JvmOverloads
使用默认arg的kotlin方法的注解创建了一个可从java端访问的方法。
问题是为什么有两种方法如何从java调用kotlin的默认值? 为什么不做一切可以访问/默认情况下不可访问? 这是一个糟糕的设计,还是有这个严肃的理由?
我相信,当前设计背后的考虑是基于以下事实:类中存在默认(无参数)构造函数是JVM上广泛使用的约定:依赖于它的许多库和框架(例如,dependency injection工具,JSR-305)。 因此,如果所有参数的默认值都支持这些用例,那么生成一个无参数的构造函数,用户可能会期望这样做。
相反,函数通常不具有所有参数的默认值,我不认为这是Java世界中任何习惯用法所需要的。 而且,在Kotlin类中可以预期很多具有默认值的函数,并且默认情况下为它们生成重载会导致不希望的方法计数增长,这对于Android尤其重要。