0

我正在编写一个简单的 JSON 序列化程序,用于java.io.File简化路径:

import java.io.File

import play.api.libs.json._
import Implicits.File._

object Implicits {
  object File {
    implicit val format: Format[File] = new Format[File] {
      override def writes(o: File): JsValue = JsString(o.toString)
      override def reads(js: JsValue): JsResult[File] = js.validate[String].map(f => new File(f))
    }
  }
}

final case class Bar(path: File) 

object Bar {
  implicit val format: Format[Bar] = Json.format
}

我发现上述方法不起作用:

No instance of play.api.libs.json.Format is available for java.io.File in the implicit scope

但是,如果我将名称更改为Implicit.File.formatto Implicit.File.fmt,它就可以正常工作。

为什么在这种情况下,当它应该是隐式作用域解析器应该关心的类型时,名称会发生​​冲突?Format[File]

我正在使用 play-json 2.6.7。

4

1 回答 1

1

为什么在这种情况下,当它应该是Format[File]隐式范围解析器应该关心的类型时,名称会发生​​冲突?

因为它也关心名字。

有资格传递给 T 类型的隐式参数的实际参数分为两类。首先,符合条件的所有标识符 x 都可以在没有前缀的方法调用时访问,并且表示隐式定义或隐式参数。因此,合格的标识符可以是本地名称,或封闭模板的成员,或者可以通过导入子句使其无需前缀即可访问。

在 line implicit val format: Format[Bar] = Json.formatformat表示Bar.format和 not Implicits.File.format,因此Implicits.File.format不符合此规则的隐含条件。而且它不在伴生对象中,因此也不属于第二类。

于 2017-12-14T18:22:26.693 回答