Оценки типа Scala для методов varargs - PullRequest
4 голосов
/ 25 ноября 2010

У меня есть следующий базовый класс:

trait Foo
abstract class Bar[A <: Foo](f : A*) extends Foo

Я хочу создать подкласс:

case class Baz(f : Foo*) extends Bar(f)

Однако, когда я делаю это, компилятор расстраивается, говоря мне:

Выводимые аргументы типа [Seq [Foo]] не соответствуют границам параметров типа класса Bar [A <: Foo] </p>

Добавление явного параметра типа в Bar, как в

case class Baz(f : Foo*) extends Bar[Foo](f)

затем жалуется на несоответствие типов - находит Foo *, когда требуется Foo.

Что вызывает это? Как мне обойти это?

1 Ответ

7 голосов
/ 25 ноября 2010

Как написано выше, компилятор ожидает последовательность разделенных запятой экземпляров типа Foo в качестве аргументов для ctor из Bar, в то время как ему дается один экземпляр типа Foo*, который транслируется вSeq[Foo] за сценой.

Сделайте это:

case class Baz(f : Foo*) extends Bar[Foo](f: _*)

Так повторяются параметры между всеми методами, а не только ctors.Тогда ниже будет работать также:

case class Baz(f : Foo*) extends Bar(f: _*)
...