1

我在 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)play.api.libs.json.Json.JsValueWrapper传递给Json.arr().

我的印象是隐式转换仅在隐式转换在范围内时应用(即,它在当前范围内声明或导入)。那么这种转变是如何发生的呢?


更新:我认为 Play 控制台必须在做某事,因为即使我打开一个新控制台并进行简单分配(根本没有导入),转换也会发生:

scala> val x: play.api.libs.json.Json.JsValueWrapper = 1
x: play.api.libs.json.Json.JsValueWrapper = JsValueWrapperImpl(1)
4

1 回答 1

4

看起来这是转换: https ://github.com/playframework/playframework/blob/eeb155f39d1394ac4f​​a9a5f6316a9fe0884582b0/framework/src/play-json/src/main/scala/play/api/libs/json/Json.scala# L118

我相信它是在参数类型的显式范围内找到的,正如这个关于隐含来自哪里的答案中所述: Scala 在哪里寻找隐含?

于 2013-09-17T22:21:57.647 回答