scala打字需要隐式

时间:2016-04-12 09:59:12

标签: scala playframework playframework-2.0 scala-implicits

我正在尝试构建以下

我有一个父通用类

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),但我想逃避隐含。

1 个答案:

答案 0 :(得分: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 
    ...
}