为什么可以使用默认参数调用kotlin的构造函数而不是方法?

时间:2018-01-30 22:31:44

标签: java kotlin default-value

我很好奇为什么可以使用默认参数调用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的默认值?为什么不默认可以访问/无法访问?这是一个糟糕的设计还是有充分的理由这样做?

1 个答案:

答案 0 :(得分:3)

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

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