伴侣对象在由相关类'super-trait绑定的列表中

问题描述:

我想将Companion对象的“注册表”放在一起 - 通过将它们存储在使用泛型绑定的列表中。伴侣对象在由相关类'super-trait绑定的列表中

一个例子是最好的:上FooLookup报道

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) 
} 

错误 “DEF allFoos” 是

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

HasFoos.allFoos需要什么样子,或者列表(A,B,C)需要什么样子。

我也试过def allFoos: List[ _ <: Foo];然而它也有错误,而且,我确实想用“伴侣对象”而不是类 - 我确信我需要更多通用的糖粉,但我不确定它需要什么。

在此先感谢。

+2

我想指出这里的通配符:'def allFoos:List [_ ghik 2013-03-09 12:55:47

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

要让HasFoos按照书面进行编译,您必须在某个时候定义了一个对象Foo,以及特性,否?如果我这样做,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) 
} 

祝你好运!

+0

你已经明确地定义了我的“想要”。 **“实现Foo的类型的伴侣对象。”**;所以加入“FooCompanion”特质肯定会让我获得我以前的样子。谢谢..(我想太难了) – Ramon 2013-03-09 15:00:04