List中的Companion对象由Related类的超级特征绑定

时间:2013-03-09 11:40:15

标签: scala generics companion-object

我正在尝试将Companion Objects的“注册表”放在一起 - 将它们存储在使用泛型绑定的List中。

最好的例子是:

trait Foo
case class A() extends Foo
object A
case class B() extends Foo
object B
case class C() extends Foo
object C


trait HasFoos {
  def allFoos: List[ _ <: Foo.type]
}
case class FooLookup() extends HasFoos { 
  def allFoos = List(A,B,C)
}

FooLookup“def allFoos”上报告的错误是

  • 类型不匹配;发现:A.type required:Foo.type

HasFoos.allFoos需要看起来像什么,或者,List(A,B,C)需要看起来是什么样的。

我也试过了def allFoos: List[ _ <: Foo];但是它也有错误,并且,我确实想要使用“Companion Object”而不是类 - 我相信我需要一些更通用的糖尘,但我不确定它需要什么。

提前感谢。

1 个答案:

答案 0 :(得分:4)

所以,正如所写,我无法定义案例类FooLookup,因为我在定义特征HasFoos时收到错误“not found:value Foo”。

要让HasFoos按编写方式编译,你必须在某个时刻定义一个对象Foo,以及特征,不是吗?如果我这样做,HasFoos将编译。但是“Foo.type”是单例对象Foo的类型,而不是扩展特性Foo的类的伴随对象的类型。

A.type将是对象A的类型。如果定义了伴随特征A,它将不是实现伴随特征A的类型。

我认为没有你想要的类型抽象,它会自动捕获描述“实现Foo的类型的伴随对象”。我想你必须自己定义这样一种类型:

 trait FooCompanion
 trait Foo
 case class A() extends Foo
 object A extends FooCompanion
 case class B() extends Foo
 object B extends FooCompanion
 case class C() extends Foo
 object C extends FooCompanion

 trait HasFoos {
   def allFoos: List[FooCompanion]
 }

 case class FooLookup() extends HasFoos { 
   def allFoos = List(A,B,C)
 }
祝你好运!