用于varargs方法的Scala类型边界

时间:2010-11-25 18:16:40

标签: scala types variadic-functions

我有以下基类:

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

我想创建一个子类:

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

但是,当我这样做时,编译器会感到沮丧,告诉我:

  

推断类型参数[Seq [Foo]]不符合类Bar的类型参数界限[A&lt ;:Foo]

向Bar添加显式类型参数,如

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

然后抱怨类型不匹配 - 当需要Foo时发现Foo *。

造成这种情况的原因是什么?我应该如何解决它?

1 个答案:

答案 0 :(得分:7)

如上所述,编译器需要一组类型为Foo的逗号分隔的实例作为Bar的ctor的参数,而它被赋予类型为Foo*的单个实例。 ,被翻译为幕后的Seq[Foo]

这样做:

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

这是在所有方法之间传递重复参数的方式,而不仅仅是ctors。 然后,以下内容也将起作用:

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