在scala中隐式转换时遇到问题

时间:2014-07-19 15:25:21

标签: scala implicit-conversion json4s

拥有此代码

case class Workspace(ident: Long, name: String)
case class Project(ident: Long, name: String)

implicit def workspaceJSON: JSONR[Workspace] = new JSONR[Workspace] {
  def read(json: JValue) =
    Workspace.applyJSON(field[Long]("id"), field[String]("name"))(json)
}

implicit def projectJSON: JSONR[Project] = new JSONR[Project] {
  def read(json: JValue) =
    Project.applyJSON(field[Long]("id"), field[String]("name"))(json)
}

def parseEnt[T: JSONR](json: JValue): Either[String, T] =
  fromJSON[T](json).toEither.left.map{ _.toString }

def fetchProjects(ws: Workspace): Either[String, Project] = {
  parseEnt(parse("some text"))
}

无法使用

parseEnt(parse("some text"))上编译
ambiguous implicit values:  both method taskJSON in class Fetcher of type =>
Fetcher.this.JSONR[types.Task]  and method workspaceJSON in class Fetcher of type =>
Fetcher.this.JSONR[Fetcher.this.Workspace]  match expected type Fetcher.this.JSONR[T]

有没有办法确保scala,在这种情况下我希望类型变量TProject并选择projectJSON函数来解析它?或者,如果我做错了,那么它是如何正确的?

1 个答案:

答案 0 :(得分:0)

编译器正在尝试自动推断类型T,它必须是可以从String开始生成的类型(或多或少,但详细信息在这里不重要)

不幸的是,它无法成功,因为您提供了从StringProjectWorkspace的多个隐式转化。简单的解决方案是明确指出您尝试生成的类型:

parseEnt[Project](parse("some text"))

这种模式在序列化类型类中相当常见,您可以将多个特定类型映射到通用类型(在这种情况下为String)。