【发布时间】:2019-09-10 15:02:47
【问题描述】:
考虑以下代码:
class Foo(val bar: String, val baz: Boolean = true) {
constructor(bar: String) : this(bar, false)
}
如果不添加辅助构造函数,我可以调用Foo(""),因为第二个参数有一个默认值。这将导致baz 成为true。
添加辅助构造函数后,我仍然可以调用Foo(""),只是现在baz 是false。
为什么 Kotlin 不将其视为重复的构造函数签名,因为它们都可以使用相同的参数调用?
【问题讨论】:
-
您不需要
bar,它只会使示例复杂化。有趣的。您仍然可以致电Foo("", true)。如果它警告辅助构造函数由于默认值而毫无意义,这似乎很有用。 -
我的猜测是:因为它还没有实现 ;-) 从字节码的角度来看,我看到了 3 个构造函数……一个用于
Foo(String, Boolean),一个合成的Foo(String, DefaultConstructorMarker),它使用默认值和Foo(String)...所以这是3个不同的构造函数...也许即将到来...另一方面我不知道我什么时候有过这样的星座...而且成本/收益比可能不是太好了…… -
如果你使用'first'或'second'构造函数,你总是需要提供至少一个参数,即
bar。在第二个构造函数中,您总是委托给主构造函数,并且您已经为它提供了一个默认值false。从反编译的代码中读取,编译器似乎生成了一个合成方法,并在其中为所有签名提供了它们的值。所以不管你调用哪个构造函数,最终所有条件都满足了。 -
@series0ne 我的帖子能回答你的问题吗? :)
-
@WilliMentzel 是的 :)
标签: kotlin