Scala中的类都具有主构造函数和可选的一些辅助构造函数(它们必须遵从主构造函数或其他辅助构造函数)。
你的情况的问题是,在这两种情况下,你已经定义主构造函数为不带参数 - 然后在第二种情况下,你尝试定义一个具有相同签名的辅助构造函数。这不起作用,出于同样的原因,以下不会编译:
// Primary constructor takes a String
class Foo(s: String) {
// Auxiliary constructor also takes a String?? (compile error)
def this(a: String) {
this(a)
}
}
这不是什么关系的事实,构造器是无参数;例如下面的编译:
class Foo(s: String) {
// alternative no-arg constructor (with different signature from primary)
def this() {
this("Default value from auxiliary constructor")
}
}
特别是,在你的第二个例子,您的评论“唯一的构造函数”是错误。辅助构造函数是总是次要主构造函数,并且永远不可能是唯一的构造函数。
FWIW,第一个例子是唯一对您开放的选项,但它对我来说看起来很好。如果你刚开始使用Scala,我相信它很快就会开始感觉良好 - 当有更多的惯用选择时,避免Java风格的做事方式是很重要的。
辅助构造函数也可以服从前面定义的其他辅助构造函数。 –
@ jean-phillipe:谢谢,你说得对。我刚刚意识到这在我自己的广泛范围内并不准确;现在更正后。 –
谢谢,从一开始就让我对Scala构造函数感到困扰,但它从来没有像我这么做太多......现在已经很清楚了。 – HairyFotr