scala 类型需要隐式

scala typing require implicit

我正在努力建立以下

我有一个父通用 class

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 进行编译,但是 class 应该实现 Writes 隐含的信息会丢失。 或者我应该使用不同的方法吗?我可能会为我所有的结果案例 classes(例如 LengthResult)创建一个 superclass,但我想摆脱隐含。

您应该可以编写 ResultProvider[_](如果您不熟悉此语法,请搜索 "existential types"),但您需要为隐式命名:

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