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