原 荐 关于 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 条评论
登录 后参与评论

相关文章

来自专栏大前端开发

理解和使用ES6中的Symbol

ES6中引入了一种新的基础数据类型:Symbol,不过很多开发者可能都不怎么了解它,或者觉得在实际的开发工作中并没有什么场景应用到它,那么今天我们来讲讲这个数据...

1613
来自专栏后端之路

JMockit原理剖析

上篇文章描述了Jmockit的最基本的也是最方便也是最神奇的mock神技单元测试JMockit使用 本篇大概就其原理好好说道。 背景知识 Instrumenta...

6399
来自专栏青青天空树

springboot+security整合3

  这篇讲解如何自定义鉴权过程,实现根据数据库查询出的url和method是否匹配当前请求的url和method来决定有没有权限。security鉴权过程如下:...

2052
来自专栏算法修养

CodeForces 709C Letters Cyclic Shift

C. Letters Cyclic Shift time limit per test 1 second memory limit per test ...

2976
来自专栏用户画像

Java 枚举 String-String

853
来自专栏向治洪

android报错 Expected BEGIN_OBJECT but was STRING at line 1 column 39 path $

      我在使用retrofit和Gson配合时,出现了这个问题,疑惑中乱七八糟瞎搞了一个下午没有解决。期间怀疑Gson解析不能使用泛型(因为我的解析使用了...

2789
来自专栏Python疯子

数据库怎么存储手机号,QQ等纯数字内容,最省内存

1093
来自专栏osc同步分享

springmvc 其他

<!-- 配置直接转发的页面 --> <!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法. --> <mvc:view-contr...

3508
来自专栏别先生

Spring的核心之IoC容器创建对象

Spring的Ioc容器,是Spring的核心内容:   作用:对象的创建和处理对象的依赖关系。 Spring容器创建对象有以下几种方式:   1:调...

2105
来自专栏Hongten

Struts2 ActionWildcard(通配符配置)约定优于配置

新建web project:struts2_0500_actionwildcard

862

扫码关注云+社区