为什么即使未导入jvalue2monadic,JValue也可以隐式转换为MonadicJValue?

时间:2015-05-11 13:16:33

标签: scala json4s

在json4s中,代码可以这样写:

import org.json4s._
import org.json4s.jackson.JsonMethods._
...
val x: MonadicJValue = JObject()

这是正确的,因为功能

implicit def jvalue2monadic(jv: JValue) = new MonadicJValue(jv)
第一行import org.json4s._行将

导入范围。

(source of jvalue2monadic defination on github)

但是,我尝试了另一部分代码,它也运行良好:

import org.json4s.{JObject, MonadicJValue}
import org.json4s.jackson.JsonMethods.parse
...
val x: MonadicJValue = JObject()

由于隐式功能未导入此范围,我不知道它是如何工作的!

1 个答案:

答案 0 :(得分:2)

我终于得到了帖子Where does Scala look for implicits?

的答案
  

从基于Scala 2.8的“Scala编程,第2版”一书中,我学到了隐含的规则,即 scala编译器将在同伴对象中查找隐式定义。源或目标类型,但我没有得知 scala编译器也会在外部对象中寻找嵌套类型的隐式定义

在上面的问题中,隐式定义

abs(x) < 0.00001

在包对象implicit def jvalue2monadic(jv: JValue) = new MonadicJValue(jv)中定义,它是包层结构嵌套org.json4s / JValueJObject中的外部对象。因此,在需要时,scala编译器肯定会使用MonadicJValue