2

Scala でジェネリック クラスを定義するとき、型パラメーター 'A' がケース クラスでなければならないことを確認するにはどうすればよいですか?

class TypedCollection[A](name: String){}

環境:

ケースクラスのコレクションであるかのように、reactivemongo JSONCollection と対話する汎用の 'TypedCollection' ラッパー クラスを定義しようとしています (リレーショナル データベースの Typesafe Slick に似ています)。

「A」がケース クラスでなければならない理由は、自動的に「unapply」メソッドが与えられるためです。このメソッドは、「A」型から JsObject または BSONObject への暗黙的な変換を作成するときにジェネリック クラスで使用されるため、MongoDB に格納できます。すなわち

implicit val AWrites = Json.writes[A]

implicit val AReads = Json.reads[A]
4

1 に答える 1

1

すべてのケース クラス (およびタプル) の最も具体的な直接の祖先はProductです。scaladoc では、コンパニオン オブジェクトの子孫にunapplyを常に提供することは直接言及されていませんが、実際にはすべてのサブクラス (ケース クラスとタプル) がこの規則に従います。したがって、次のように型パラメーターのバインドを定義できます。

class TypedCollection[A <: Product](name: String){}
于 2016-05-10T11:25:26.753 に答える