Ваш вопрос можно суммировать как:
scala> class A { def aSeq(i: Int*) = 1 }
defined class A
scala> class B extends A { override def aSeq(i: Seq[Int]) = 2 }
<console>:6: error: method aSeq overrides nothing
class B extends A { override def aSeq(i: Seq[Int]) = 2 }
Методы имеют разные типы. В спецификации сказано (выделено мое):
Тип такого повторяющегося параметра внутри . Метод имеет тип последовательности scala.Seq [T]
Поскольку Int*
и Seq[Int]
не находятся внутри метода, это конкретное предложение неприменимо.
Интересно, что следующий код показывает, что методы имеют различные типы до стирания, но одинаковые после:
scala> class G { def aSeq(i:Int*) = 1; def aSeq(i:Seq[Int]) = 2 }
<console>:5: error: double definition:
method aSeq:(i: Seq[Int])Int and
method aSeq:(i: Int*)Int at line 5
have same type after erasure: (i: Seq)Int
class G { def aSeq(i:Int*) = 1; def aSeq(i:Seq[Int]) = 2 }
Таким образом, возникает вопрос, почему ваш B
класс может расширять ваш A
абстрактный класс. Там может быть несоответствие в спецификации там. Я не знаю ...
Редактировать: я перечитал спецификацию и не могу понять, есть ли что-нибудь, связанное с повторяющимися параметрами и переопределением. Похоже, что-то не относится к типу возвращаемых повторяющихся параметров, что вы получаете для метода доступа val aSeq
.
Я думаю, что ответ Марка - совершенно правильный подход. Если вы не можете следовать этому, вы можете использовать следующий обходной путь:
class C extends B {
private def aSeqHelper(a: A*) = a
override val aSeq = aSeqHelper(Seq[A](): _*)
}
Так, например:
import scala.xml._
class ElemX extends Elem("pref", "label", <xml a="b"/>.attributes, TopScope) {
private def childHelper(c: Node*) = c
override val child = childHelper(<foo/><bar/>: _*) }
Тогда:
scala> new ElemX
res4: ElemX = <pref:label a="b"><foo></foo><bar></bar></pref:label>