原 荐 关于 Scala 隐式转换必读的一篇

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))

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JetpropelledSnake

Python入门之装饰器

讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切。 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我...

27212
来自专栏tkokof 的技术,小趣及杂念

Sweet Snippet系列 之 元素删除

  平时代码总会遇到一些关于集合的操作,例如添加,排序等等,都可算作稀松平常,但是集合涉及的删除操作却一直有个大坑,我自己便跳进去过好几回,在此简单一记,以自警...

451
来自专栏小詹同学

Python系列之零——从零说起!!!

2017年可谓是人工智能元年,要问哪个行业最火,詹小白不敢确定,但要问哪个编程语言最热门,好吧,詹小白还是不敢说太满。但是!至少从舆论Pytho...

33810
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列1

Java面试系列1 1 静态变量和实例变量的区别? 静态变量也称作类变量,由static修饰,如:static int s; s就是静态变量,它只能通过类来访...

2605
来自专栏韩伟的专栏

C#语言和JAVA、C++的对比学习

很早以前,就听说著名的BorlandDelphi开发者,去微软设计了一门伟大的语言C#。但是由于一直都在Linux上做开发,所以无缘拜会。直到最近几年,借手游大...

2454
来自专栏carven

浅谈js的date对象对时间字符串的解析

最近的时间都在开发社团内部的应用–隧道口,虽然只有简单的几个页面,但是依然是遇到了不少坑。 其中 date 的时间处理就是一个。

620
来自专栏一个会写诗的程序员的博客

前端知识体系整理(不断更新)

var x = {}; var y = []; var z = null; typeof x; // "object" typeof y; // "objec...

732
来自专栏程序员叨叨叨

听说你们家的NotifyDataSetChanged不起作用了

前几天,公司项目准备上线,就在前一晚,出现了一个BUG:主页界面刷新无效。千钧一发之际,用了一个笨方法,每次刷新的时候重新setAdapter一下算是实现了基本...

662
来自专栏Jerry的SAP技术分享

一个查看UI5控件所有公有方法的小技巧

一个很小的tip:比如我想把UI5表格控件里的每列设置成宽度根据显示的内容自适应,需要知道应该调用控件的哪个方法来实现。

1909
来自专栏北京马哥教育

Python with提前退出:坑与解决方案

? 问题的起源 早些时候使用with实现了一版全局进程锁,希望实现以下效果: ? 全局进程锁本身不用多说,大部分都依靠外部的缓存来实现的,redis上用的是s...

2695

扫码关注云+社区