隐式转换发生时没有导入隐式?

时间:2013-09-17 20:26:29

标签: scala implicit-conversion

我在Play Framework的Scala控制台中玩游戏,看起来它在某种程度上进行了隐式转换而没有任何隐式defs:

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()值被转换为scala> val x: play.api.libs.json.Json.JsValueWrapper = 1 x: play.api.libs.json.Json.JsValueWrapper = JsValueWrapperImpl(1) 个实例。

我的印象是隐式转换仅在隐式转换在范围内时应用(即,它在当前范围内声明或导入)。那么转换是怎么回事?


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

{{1}}

1 个答案:

答案 0 :(得分:4)

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

我相信它是在参数类型的显式范围内找到的,如本答案中所描述的关于implicits的来源: Where does Scala look for implicits?