【发布时间】:2011-07-27 14:40:58
【问题描述】:
Scala 语言规范 2.8 版的第 4.6.2 节描述了重复的参数并说:
参数部分的最后一个值参数可以用“*”作为后缀,例如(..., x:T*)。方法内部的这种 repeated 参数的类型就是序列类型 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 的实例,但即使以下代码也无法编译并显示相同的消息: p>
class C extends B { override val aSeq = new ofRef(Array[A]()) }
所以问题是,我如何去覆盖由类上的重复参数定义的成员?
如果你想知道这是从哪里来的,这正是 scala.xml.Elem 所做的,它覆盖了 scala.xml.Node 中的 child 方法。
【问题讨论】:
-
我建议不要在类中使用重复参数作为
vals(我有点惊讶它可以编译)。取而代之的是class B(val aSeq: Seq[A]) extends A,如果您想使用语法B(a1, a2, ...),请将其添加到伴随对象中:object B {def apply(aSeq : A*) = new B(aSeq)}。 -
不是我的代码在使用它。正如我在帖子末尾所说,重复的参数由 scala.xml.Node 的 scala.xml.Elem 子类使用。我没有更改它的选项。
-
啊,我看错了。刚刚检查了
scala.xml.Node而不是scala.xml.Elem。 -
我试过
override val seq: Int* = Seq(1,2)和override val seq = Seq(1,2): _*。不幸的是,两者都不起作用。我怀疑这可能是不可能的,但希望这是错误的。
标签: scala