【问题标题】:Why can JValue be implicitly converted to MonadicJValue even if jvalue2monadic is not imported?为什么即使没有导入 jvalue2monadic,JValue 也可以隐式转换为 MonadicJValue?
【发布时间】:2015-05-11 13:16:33
【问题描述】:

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

由于没有将隐式函数导入到这个作用域中,所以我不知道它是如何工作的!

【问题讨论】:

  • 我相信是因为JObject和implicit是在同一个对象中定义的,但我不确定
  • @Daenyth 我自己尝试了一个小演示,像 json4s 一样定义我的类和隐式函数,但事实证明我的隐式根本不起作用。所以我不认为这是因为它们是在同一个对象中定义的。

标签: scala json4s


【解决方案1】:

终于从Where does Scala look for implicits?这个帖子里得到了答案

从基于 Scala 2.8 的“Scala 编程,第 2 版”一书中,我了解到 scala 编译器会在源类型或目标类型,但是我不知道 scala 编译器还会在外部对象中查找嵌套类型的隐式定义

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

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

在包对象org.json4s 中定义,它是包层次结构中嵌套JValue/JObjectMonadicJValue 的外部对象。所以,jvalue2monadic 肯定会在需要时被 scala 编译器使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    相关资源
    最近更新 更多