1

私は以下を構築しようとしています

親ジェネリッククラスがあります

abstract class ResultProvider[+T: Writes](db: DB) {
  def get(id: Long): Future[Seq[T]]
}

そして、いくつかの実装、例えば

class LengthProvider(db: DB) extends ResultProvider[LengthResult](db){
  override def get (userId: Long): Future[Seq[LengthResult]] = ...
}

object LengthProvider extends ((DB) => DisciplinePredictor) {
  override def apply(db: DB) = new LengthProvider(db)
}

次の構成マップがあります。

val providers: Map[String, ((DB) => ResultProvider[???])] = Map(
  "length" -> LengthProvider,
  "width"  -> WidthProvider,
   ...
)

私の質問は、???の代わりに何を入れるべきかです。理想的には、このタイプが暗黙的に実装されT : Writesていることだけを気にするので、次のようにする必要があります。でコンパイルされますが、クラスが暗黙的に実装する必要があるという情報が失われます。または、別のアプローチを使用する必要がありますか? おそらく、すべての結果ケース クラス (例: ) に対してスーパークラスを作成することもできますが、暗黙のクラスを回避したいと考えています。WritesJson.toJsonAnyWritesLengthResult

4

1 に答える 1

1

書くことができるはずですがResultProvider[_](この構文に慣れていない場合は「存在する型」を検索してください)、暗黙的に名前を付ける必要があります。

abstract class ResultProvider[+T](db: DB)(implicit val writes: Writes[T]) { ... }

他の場所:

val provider: ResultProvider[_] = providers("length")
import provider.writes // makes the implicit visible here
...

型変数を指定して、コンパイラ (または型に名前を付ける必要がある場合は自分自身) を支援する必要がある場合があります。

providers("length") match {
  case provider: ResultProvider[a] =>
    import provider.writes 
    ...
}
于 2016-04-12T13:59:29.420 に答える