Java 为什么';可以打电话给kotlin';具有默认参数但不是方法的构造函数?

Java 为什么';可以打电话给kotlin';具有默认参数但不是方法的构造函数?,java,kotlin,default-value,Java,Kotlin,Default Value,我很好奇为什么可以用默认参数调用kotlin的构造函数,而不是从java代码调用方法 例如: class Test(val test: String = "") Java客户端: void test() { new Test(); } 没关系 但如果我想用method做同样的把戏,那是不可能的: class Test { fun x(x: Int = 5) { } } Java客户端,编译错误: void test() { new Test().x(

我很好奇为什么可以用默认参数调用kotlin的构造函数,而不是从java代码调用方法

例如:

class Test(val test: String = "")
Java客户端:

void test() {
        new Test();
}
没关系

但如果我想用method做同样的把戏,那是不可能的:

class Test {
    fun x(x: Int = 5) { }
}
Java客户端,编译错误:

void test() {
        new Test().x();
}
在我看到的反编译为java字节码的方法中

x$默认值

方法。它是静态的,我不能从java调用它(idea不允许我这么做)。并且只添加了

@JVM重载

kotlin方法上带有默认参数的注释创建了另外一个可以从java端访问的方法


问题是为什么有两种方法可以从java调用kotlin的默认值?为什么不在默认情况下执行所有可访问/不可访问的操作?这是一个糟糕的设计还是有充分的理由这么做

我认为,当前设计背后的考虑是基于这样一个事实:类中存在默认(无参数)构造函数是JVM上广泛使用的约定:有许多库和框架依赖于它(例如依赖注入工具,JSR-305)。因此,当所有参数都有默认值时生成无参数构造函数支持这些用例,并且用户可能会期望这样做


相反,函数的所有参数通常没有默认值,我认为Java世界中的任何习惯用法都不需要默认值。此外,Kotlin类中可能会有许多函数具有默认值,默认情况下为它们生成重载将导致方法计数增长,这对于Android来说尤其重要。

谢谢您的评论!我现在正在研究kotlin的字节码,它产生了许多额外的方法(比如每个字段的组件,一些桥接e.t.c.)。此外,在我们的案例中,我们已经有x$违约。我不明白为什么默认情况下它是关闭的。不过,据我所知,方法计数是Kotlin JVM后端的一个重要指标:他们努力不增加Kotlin生成的字节码中的方法计数,大多数合成方法都存在,因为没有可行的替代方法(例如,
x$default
是必需的,以避免在调用站点内联默认值代码,从而不需要在库代码更改时重新编译客户端代码)。还有一点:默认情况下为所有函数启用
@JVMLowloads
的行为对于仅Kotlin的项目没有任何意义,它只会伤害它们(谢谢!现在对我来说更干净了)在“仅Kotlin”一词中-我同意。这毫无意义。B.t.w.为了更好地与java进行互操作,是否有任何vm参数/插件可以启用所有这些东西(@JVMLowloads,@JvmStatic e.t.c.)?