我正在尝试将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”上报告的错误是
HasFoos.allFoos需要看起来像什么,或者,List(A,B,C)需要看起来是什么样的。
我也试过了def allFoos: List[ _ <: Foo]
;但是它也有错误,并且,我确实想要使用“Companion Object”而不是类 - 我相信我需要一些更通用的糖尘,但我不确定它需要什么。
提前感谢。
答案 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)
}
祝你好运!