2016-05-10 19 views
2

スカラでジェネリッククラスを定義するときに、どのようにして型パラメータ 'A'をケースクラスにする必要がありますか?Scalaケースクラスのみを受け入れるジェネリッククラスを定義する

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

コンテキスト:

私はそれが(リレーショナルデータベース用スリックタイプセーフと同様)ケースクラスのコレクションであるかのようreactivemongo JSONCollectionをやり取りするために、一般的な「TypedCollection」ラッパークラスを定義しようとしています。

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

implicit val AWrites = Json.writes[A] 

implicit val AReads = Json.reads[A] 
+3

'そこにAをチェックしていない理由は...目標を参照してくださいしないでください:OWrites'、または' A:OFormat'(または 'A:BSONDocumentを{リーダー、ライター} ')? – cchantep

答えて

1

すべての場合クラス(ならびにタプル)の最も具体的な直接の祖先は、商品あります。 scaladocで直接言及されていないのは、子孫のために常にの適用外のの付随オブジェクトを提供していますが、実際にはすべてのサブクラス(ケースクラスとタプル)がこの規約に従います。だから、あなたはこのようなあなたのtypeパラメータにバインド定義することができます。

class TypedCollection[A <: Product](name: String){} 
+0

Scalaはそれを知らないので、Productをどのようにインポートしますか? – Sparky

関連する問題