2015-05-11 18 views
2

在json4s,代码可以被写成这样:即使未导入jvalue2monadic,为什么可以将JValue隐式转换为MonadicJValue?

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() 

由于隐函数不导入到这个范围,我不知道它是如何工作!

+0

我相信这是因为JObject和隐式定义在同一个对象中,但我不确定 – Daenyth

+0

@Daenyth我自己尝试了一个小演示,定义了我的类和隐式函数,就像json4s做的一样,但它转向我的隐含根本不起作用。所以我不认为这是因为它们被定义在同一个对象中。 –

回答

2

我终于得到了答案从岗位Where does Scala look for implicits?

从书“在Scala编程(第二版)”,这是基于斯卡拉2.8,我了解到,Scala编译器会隐含规则在源或目标类型的伴随对象中查找隐式定义,但是我没有知道scala编译器也将在嵌套类型的外部对象中查找隐式定义。

在上面的问题,隐含定义

implicit def jvalue2monadic(jv: JValue) = new MonadicJValue(jv)

在包对象org.json4s,这是在包装层次结构外部对象嵌套定义要么JValue/JObjectMonadicJValue。因此,jvalue2monadic肯定会在需要时由scala编译器使用。

相关问题