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


声明:本文转载自https://my.oschina.net/joymufeng/blog/1819328,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

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 。

本文发表于2018年05月28日 08:00
(c)注:本文转载自https://my.oschina.net/joymufeng/blog/1819328,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2029 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1