2011-09-02 150 views
1

我有以下情形:Scala的情況下類的構造函數與WrappedArray參數

sealed abstract class Type(val inUse: Boolean) 

case class IntTy(override val inUse: Boolean) extends Type(inUse) 

case class TupleTy(override val inUse: Boolean, elems: Type*) extends Type(inUse) { 
    def this(elems: Type*) = this(false, elems:_*) 
} 

在斯卡拉2.8.0這個工作得很好,我可以創造一個新的TupleTy實例:

TupleTy(IntTy(false)) 

然而,我剛更新到Scala 2.9.1 final,它不再有效。我現在得到以下錯誤:

error: type mismatch; 
found : IntTy 
required: Boolean 
       TupleTy(IntTy(false)) 
         ^

這是一個錯誤還是我錯過了somehing?

+0

我正要建議給INUSE一個默認值,但是:'錯誤:帶有'*'參數的參數段不允許有默認參數':-(好吧,很高興知道。 – PhiLho

回答

5

我不確定它是否適用於2.8.0。

您已經定義了一個額外的構造函數,但不是附加的工廠方法。

new TupleTy(IntTy(false)) // works as expected 

編輯

這裏是一個可能的解決方法

case class TupleTy(override val inUse: Boolean = false)(elems: Type*) extends Type(inUse) 

現在你可以做醜陋的東西就是這樣,但你不應該。沒有,你不應該。

TupleTy()(IntTy(false)) 
3

與「新」(就像一個普通類)創建TupleTy工作:

scala> new TupleTy(IntTy(false)) 
res3: TupleTy = TupleTy(false,WrappedArray(IntTy(false))) 

額外的構造函數的情況下,類需要與「新」的調用,因爲(不同於默認構造函數)不會將「翻譯」轉換爲伴隨對象上的應用方法。 請注意,「unapply」也不會生成,因此TupleTy上的模式匹配可能無法按預期工作。

這裏有一些background discussion on scala-lang.org至於爲什麼scala編譯器沒有被擴充來處理多個case類構造函數。

編輯您可以創建額外的「應用」自己,如果你想:

object TupleTy { 
    def apply(elems: Type*) = new TupleTy(false, elems:_*) 
} 

與,你可以這樣做:

scala> TupleTy(IntTy(false)) 
res4: TupleTy = TupleTy(false,WrappedArray(IntTy(false))) 
相關問題