Scala中无参数`implicit def`的用法解析及示例说明
解析无参数
implicit def的Scala用法 这段代码里的无参数implicit def并不是用来做类型转换的,而是作为隐式实例的生成器,帮编译器自动创建特定类型的隐式值,属于Scala隐式体系里的「隐式提供者」用法。
代码拆解
[A: Writes, B: Writes]是上下文绑定语法,等价于给方法添加两个隐式参数(implicit wa: Writes[A], wb: Writes[B]),意思是:只有当当前作用域里存在A和B对应的Writes隐式实例时,这个方法才能被调用。- 方法返回
Writes[Either[A, B]]实例(Writes一般是序列化框架比如Play JSON里的类型,负责把对象转成JSON格式)。 - 方法体用模式匹配处理
Either的两种情况:如果是Left(a),就用A的Writes序列化a;如果是Right(b),就用B的Writes序列化b。
为什么用无参数implicit def
这种写法是为了通用化生成隐式实例:
- 不用为每一对
(A,B)手动定义Writes[Either[A,B]]实例,只要A和B各自有对应的Writes,编译器在需要Writes[Either[A,B]]时,会自动调用这个无参数隐式方法生成实例。 - 属于「延迟生成」逻辑,只有当代码真正用到
Either[A,B]的序列化时,才会触发实例创建。
实际使用示例
以Play JSON框架为例,完整示例代码如下:
import play.api.libs.json._ // 先定义基础类型的Writes隐式实例 implicit val intWrites: Writes[Int] = Writes.intWrites implicit val stringWrites: Writes[String] = Writes.stringWrites // 你的无参数隐式方法 implicit def eitherWrites[A: Writes, B: Writes] = Writes[Either[A, B]]({ case Left(a) => implicitly[Writes[A]].writes(a) case Right(b) => implicitly[Writes[B]].writes(b) }) // 测试序列化Either val leftCase: Either[Int, String] = Left(100) val rightCase: Either[Int, String] = Right("Scala隐式") // 编译器自动找到eitherWrites生成的Writes实例,完成序列化 println(Json.toJson(leftCase)) // 输出: 100 println(Json.toJson(rightCase)) // 输出: "Scala隐式"
和带参数隐式转换的区别
- 带参数的
implicit def:核心是类型转换,比如implicit def intToStr(i: Int): String = i.toString,把Int类型转成String类型,让代码可以把Int当String用。 - 无参数的
implicit def:核心是提供隐式值,它本身不做类型转换,而是生成某个类型的实例,供编译器在需要隐式参数时自动调用。
内容的提问来源于stack exchange,提问作者Duc Le
相关产品推荐
相关产品推荐

