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,因为我只关心这种类型是否已Writes隐式实现,正如我将要介绍的那样Json.toJson。它将与 一起编译Any,但是该类应该Writes隐式实现的信息会丢失。还是我应该使用不同的方法?我可能可以为我的所有结果案例类(例如LengthResult)创建一个超类,但我想摆脱隐含。

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 回答