在此示例中,为什么隐式的名称似乎会影响其范围分辨率



我正在编写一个简单的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.format的名称更改为Implicit.File.fmt,则可以正常工作。

为什么在这种情况下,该名称在这种情况下应为 type Format[File],隐式范围解析器应该关心?

我正在使用play-json 2.6.7。

为什么在这种情况下,该名称在这种情况下应为 Format[File]的类型,即隐式示波器解析器应该关心?

因为它也确实在乎该名称。

有资格传递给T型隐式参数的实际参数分为两类。首先,符合条件是所有标识符X,可以在没有前缀的情况下在方法调用的点上访问,这表示隐式定义或隐式参数。因此,合格的标识符可以是本地名称,也可以是封闭模板的成员,也可以通过导入条款前缀在没有前缀的情况下可以访问它。

implicit val format: Format[Bar] = Json.format行中,format表示Bar.format,而不是Implicits.File.format,因此Implicits.File.format不符合此规则的隐式资格。而且它不在伴随对象中,因此第二类也不涵盖。

相关内容

  • 没有找到相关文章

最新更新