0

我正在尝试将伴随对象的“注册表”放在一起 - 通过将它们存储在使用泛型绑定的列表中。

一个例子是最好的:

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 要求:Foo.type

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

我也试过def allFoos: List[ _ <: Foo]了;但是它也会出错,而且,我确实想使用“伴随对象”而不是类 - 我确信我需要一些更通用的糖粉,但不确定它需要什么。

提前致谢。

4

1 回答 1

4

因此,正如所写,我无法定义案例类 FooLookup,因为在定义特征 HasFoos 时出现错误“未找到:值 Foo”。

为了让 HasFoos 能够按照书面形式进行编译,您必须在某些时候定义一个对象 Foo 以及 trait,不是吗?如果我这样做,HasFoos 将编译。但是“Foo.type”是单例对象 Foo 的类型,而不是扩展特征 Foo 的类的伴生对象的类型。

A.type 将是对象 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)
 }

祝你好运!

于 2013-03-09T12:46:14.063 回答