2013-03-09 65 views
0

我想將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 [_ <:Foo.type]'是不必要的,因爲Scala的類型方差。 Scala中的'List'是協變的,這意味着你可以安全地鍵入'List [String]'類型'List [Any]'的變量 - 這是Java永遠無法做到的。 – ghik 2013-03-09 12:55:47

回答

4

所以,正如所寫的,我無法定義案例類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