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
...
}
我正在努力建立以下
我有一个父通用 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
...
}