Scala語言規範版本2.8的第4.6.2節描述了重複參數和表示:在Scala中覆蓋重複的類參數?
的參數部分的最後值參數可以由「*」,例如爲後綴(...,x:T *)。這樣一個類型的重複參數裏面的方法就是序列類型scala.Seq [T]。
但是,此代碼:
abstract class A { def aSeq : Seq[A] }
class B(val aSeq : A*) extends A
class C extends B { override val aSeq :Seq[A] = Seq() }
編譯時提供一個錯誤:
overriding value aSeq in class B of type A*; value aSeq has incompatible type
編譯器似乎表明A *選自SEQ的獨特的類型[A] 。
調查的實際類ASEQ在這種情況下,表明它的一個實例scala.collection.mutable.WrappedArray $ ofRef但即使下面的代碼失敗,相同的消息編譯:
class C extends B { override val aSeq = new ofRef(Array[A]()) }
所以問題是,我該如何重寫由班上重複參數定義的成員呢?
如果你想知道這是從哪裏來的,那就是scala.xml.Elem所做的,以覆蓋scala.xml.Node中的子方法。
我建議不使用的一類重複參數'val's(我有點驚訝它編譯所有) 。相反,如果你想讓語法B(a1,a2,...)有效,你可以在class B(val aSeq:Seq [A])中擴展A',並將它添加到伴隨對象中:'object B {def適用(aSeq:A *)=新B(aSeq)}'。 – 2011-04-01 13:29:33
這不是我的代碼使用它。正如我在帖子末尾所說的,重複的參數被scala.xml.Node的scala.xml.Elem子類使用。我沒有選擇改變它。 – DougC 2011-04-01 13:40:06
啊,我誤解了。剛剛檢查過'scala.xml.Node'而不是'scala.xml.Elem'。 – 2011-04-01 13:46:02