为什么有可能调用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尤其重要。