我正在尝试构建以下
我有一个父通用类
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
),但我想逃避隐含。
答案 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
...
}