Scala 的隐式转换系统定义了一套定义良好的查找机制,让编译器能够调整代码。Scala 编译器可以推导下面两种情况:
- 缺少参数的方法调用或构造器调用;
- 缺少了的从一种类型到另一种类型的转换。(是指调用某个对象上不存在的方法时,隐式转换自动把对象转换成有该方法的对象)
介绍隐式转换系统
implicit 关键字可通过两种方式使用:1、方法或变量定义;2、方法参数列表。如果关键字用在变量或方法上,等于告诉编译器在隐式解析(implicit resolution)的过程中可以使用这些方法和变量。
隐式解析是指编译器发现代码里的缺少部分信息,而去查找缺少信息的过程。
implicit 关键字用在方法参数列表的开头,是告诉编译器应当通过隐式解析来确定所有的参数值。
scala> def findAnInt(implicit x: Int) = x
findAnInt: (implicit x: Int)Int
scala> findAnInt
<console>:9: error: could not find implicit value for parameter x: Int
findAnInt
^
scala> implicit val test = 5
test: Int = 5
scala> findAnInt
res1: Int = 5
scala> def findTwoInt(implicit a: Int, b: Int) = a + b
findTwoInt: (implicit a: Int, implicit b: Int)Int
scala> findTwoInt // implicit 作用于整个参数列表
res2: Int = 10
scala> implicit val test2 = 5
test2: Int = 5
scala> findTwoInt
<console>:11: error: ambiguous implicit values:
both value test of type => Int
and value test2 of type => Int
match expected type Int
findTwoInt
^
scala> findTwoInt(2, 5) // 隐式的方法参数仍然能够显式给出
res4: Int = 7
隐式的方法参数仍然能够显式给出。