我在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实例。
我的印象是,隐式转换仅在隐式转换处于作用域(即在当前范围中声明或导入)时应用。那么,这种转换是如何发生的呢?
Update:我认为播放控制台一定在做一些事情,因为即使我打开了一个新的控制台并做了一个简单的分配(根本没有导入),转换也会发生:
scala> val x: play.api.libs.json.Json.JsValueWrapper = 1
x: play.api.libs.json.Json.JsValueWrapper = JsValueWrapperImpl(1)发布于 2013-09-17 22:21:57
https://stackoverflow.com/questions/18859267
复制相似问题