【发布时间】:2013-09-17 20:26:29
【问题描述】:
我在 Play Framework 的 Scala 控制台中玩耍,看起来它以某种方式进行了隐式转换,而没有任何隐式定义:
scala> import play.api.libs.json._
import play.api.libs.json._
scala> :implicits
No implicits have been imported other than those in Predef.
scala> Json.arr _
res0: Seq[play.api.libs.json.Json.JsValueWrapper] => play.api.libs.json.JsArray = <function1>
scala> Json.arr(1,2,3)
res1: play.api.libs.json.JsArray = [1,2,3]
如您所见,:implicits 的输出显示范围内唯一的隐式转换是来自scala.Predef 的转换。但是,当我将 Int 值 (1,2,3) 传递给 Json.arr() 时,它们不知何故被转换为 play.api.libs.json.Json.JsValueWrapper 实例。
我的印象是隐式转换仅在隐式转换在范围内时应用(即,它在当前范围内声明或导入)。那么这种转换是如何发生的呢?
更新:我认为 Play 控制台一定在做某事,因为即使我打开一个新控制台并进行简单分配(根本没有导入),转换也会发生:
scala> val x: play.api.libs.json.Json.JsValueWrapper = 1
x: play.api.libs.json.Json.JsValueWrapper = JsValueWrapperImpl(1)
【问题讨论】: