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"defallFoos"で報告されたエラーは

  • 型の不一致; 見つかった:A.typeが必要:Foo.type

HasFoos.allFoosはどのように見える必要がありますか、あるいは、List(A、B、C)はどのように見える必要がありますか。

私も試しdef allFoos: List[ _ <: Foo]ました。ただし、エラーも発生します。クラスではなく「コンパニオンオブジェクト」を使用したいのですが、その周りにもっと一般的な砂糖の粉が必要だと確信していますが、何が必要かはわかりません。

前もって感謝します。

4

1 に答える 1

4

したがって、記述されているように、特性HasFoosの定義で「notfound:value Foo」というエラーが発生するため、ケースクラスFooLookupを定義することはできません。

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

幸運を!

于 2013-03-09T12:46:14.063 に答える