为什么隐式名称似乎会影响其示例中的范围解析?

时间:2017-12-14 14:34:09

标签: scala implicit play-json

我正在为java.io.File编写一个简单的JSON序列化程序,只需加强路径:

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,则可以正常使用。

为什么名称在这种情况下会碰到隐式范围解析器应该关注的类型Format[File]

我正在使用play-json 2.6.7。

1 个答案:

答案 0 :(得分:1)

  

为什么名称在这种情况下会碰到隐式范围解析器应该关注的类型y.columns = ['a', 'b', 'c', 'd', 'f']

因为它也关心这个名字。

  
    

The actual arguments that are eligible to be passed to an implicit parameter of type T fall into two categories. First, eligible are all identifiers x that can be accessed at the point of the method call without a prefix and that denote an implicit definition or an implicit parameter. An eligible identifier may thus be a local name, or a member of an enclosing template, or it may be have been made accessible without a prefix through an import clause.

  

在第Format[File]行,implicit val format: Format[Bar] = Json.format表示format而不是Bar.format,因此Implicits.File.format不符合此规则的隐含条件。并且它不在同伴对象中,所以它也不被第二类覆盖。