我有一个求和类型,映射:
sealed trait Mapping
final case class XMapping(a:String)
final case class FallbackMapping(mappings: List[Mapping])我有一个类型化定义如下:
final case class Param(x:String)
trait ParameterLoader[T] {
def load(mapping:T) : List[Param]
}在某些情况下:
object DefaultParameterLoaders {
implicit val xParameterLoader= new QueryParameterLoader[XMapping] {
override def load(mapping: XMapping): List[Param] = List(Param(mapping.a))
}
implicit val fallbackParameterLoader = new ParameterLoader[FallbackMapping] {
override def load(mapping: FallbackMapping): List[Param] =
mapping.mappings.flatMap(x => ???)
}
}我无法找到将隐式实例传递给上面的flatMap的方法。我得到的错误是我缺少了ParameterLoaderMapping的一个实例。有没有办法告诉编译器,它应该使用任何类型类型实例的作用域?
发布于 2016-05-23 19:23:51
类型系统正在寻找特定的ParameterLoader[Mapping],这意味着ParameterLoader[XMapping]/ParameterLoader[FallbackMapping]不够具体。您需要提供一个ParameterLoader[Mapping]。您可以使用现有的定义来完成这一任务。
implicit def mappingLoader(implicit xpLoader: ParameterLoader[XMapping], fmLoader: ParameterLoader[FallbackMapping]) = new ParameterLoader[Mapping] {
def load(mapping: Mapping): List[QueryParam] =
mapping match {
case xm: XMapping = xpLoader.load(xm)
case fm: FallbackMapping => fmLoader.load(fm)
}
}或者,让您的平台地图执行匹配逻辑:
implicit def fallbackParameterLoader(implicit xpLoader: ParameterLoader[XMapping]) = new ParameterLoader[FallbackMapping] {
override def load(mapping: FallbackMapping): List[Param] =
mapping.mappings.flatMap {
case xm: XMapping = xpLoader.load(xm)
case fm: FallbackMapping => this.load(fm)
}
}https://stackoverflow.com/questions/37398771
复制相似问题