首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合材料用扇贝

复合材料用扇贝
EN

Stack Overflow用户
提问于 2016-05-23 19:13:50
回答 1查看 109关注 0票数 1

我有一个求和类型,映射:

代码语言:javascript
复制
sealed trait Mapping
final case class XMapping(a:String)
final case class FallbackMapping(mappings: List[Mapping])

我有一个类型化定义如下:

代码语言:javascript
复制
final case class Param(x:String)

trait ParameterLoader[T] {
  def load(mapping:T) : List[Param]
}

在某些情况下:

代码语言:javascript
复制
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的一个实例。有没有办法告诉编译器,它应该使用任何类型类型实例的作用域?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-23 19:23:51

类型系统正在寻找特定的ParameterLoader[Mapping],这意味着ParameterLoader[XMapping]/ParameterLoader[FallbackMapping]不够具体。您需要提供一个ParameterLoader[Mapping]。您可以使用现有的定义来完成这一任务。

代码语言:javascript
复制
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)
    }
}

或者,让您的平台地图执行匹配逻辑:

代码语言:javascript
复制
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)
    }
  }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37398771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档