关于 Scala 隐式转换必读的一篇官方圣典

原创
2018/05/27 00:52
阅读数 878

Martin 在 《Programming in Scala Third Edition》 中讲解隐式转换时提到,隐式参数或隐式转换可能来自于当前作用域,或是源类型、目标类型的伴生对象。其实真相并不是那么简单,Martin 没有更深入讲解更多的来源。这些额外的隐式转换来源对库开发者来说非常赞,可以为开发者带来更简洁的开发体验。例如我们在 Play 里经常像下面这样构建一个 JsObject :

import java.time.Instant
import play.api.libs.json.Json

object Test extends App {
 println(Json.obj("time" -> Instant.now()))
}

//输出: {"time":"2018-05-25T18:13:23.409Z"}

但是我们发现Json.obj() 方法签名如下:

def obj(fields: (String, JsValueWrapper)*): JsObject

我们并没有导入任何的隐式转换,到底是什么神奇的力量将 Instant.now() 转换成了 JsValueWrapper ? 其实原因很简单,隐式转换有一个来源是目标类型的父对象成员。JsValueWrapper 的父对象是 Json ,Json 对象定义了如下隐式转换:

implicit def toJsFieldJsValueWrapper[T](field: T)(implicit w: Writes[T]): JsValueWrapper = JsValueWrapperImpl(w.writes(field))

更多的隐式转换来源请参考官方的总结的隐式转换圣典

转载请注明作者 joymufeng 。

展开阅读全文
打赏
0
5 收藏
分享
加载中
更多评论
打赏
0 评论
5 收藏
0
分享
返回顶部
顶部