我在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}}
答案 0 :(得分:4)
我相信它是在参数类型的显式范围内找到的,如本答案中所描述的关于implicits的来源: Where does Scala look for implicits?