Scala之旅-隐式转换
隐式转换(Implicit Conversions)
从类型S到类型T的隐式转换是通过具有类型为S => T的函数的隐式值,或者通过可以转换为那种类型的值的隐式方法来定义的。
隐式转换可以应用在如下两种情况:
- 如果一个表达式e的类型是S,但是S与表达式预期的类型T不一致。
- 在一个选择操作e.m中,e的类型是S,但是选择器m并不是S的一个成员。
在第一种情况,会寻找一个可适用于e并且结果类型与T一致的转换c。在第二种情况,会寻找一个可适用于e并且结果包含成员m的转换c。
如果下面定义的隐式方法list2ordered和int2ordered是在作用域内的:
implicit def list2ordered[A](x: List[A])
(implicit elem2ordered: A => Ordered[A]): Ordered[List[A]] =
new Ordered[List[A]] { /* .. */ }
implicit def int2ordered(x: Int): Ordered[Int] =
new Ordered[Int] { /* .. */ }
则对于类型为List[Int]的两个列表xs和ys的如下操作是合法的:
xs <= ys
被隐式引入的对象scala.Predef
声明了几个预定义的类型(例如Pair)和方法(例如assert),也预定义了几个隐式转换。
举个例子,当调用一个需要传递参数java.lang.Integer
的Java方法时,你是可以给它传递scala.Int
的。那是因为Predef包含了如下隐式转换:
import scala.language.implicitConversions
implicit def int2Integer(x: Int) =
java.lang.Integer.valueOf(x)
由于如果滥用隐式转换会埋下很多隐患,当编译器编译隐式转换的定义时会发出警告。
如果要关闭警告,可以采取如下任意一种方法:
- 将
scala.language.implicitConversions
引入到隐式转换定义的作用域中 - 调用编译器时带上编译选项
-language:implicitConversions
这样当编译器应用到隐式转换时就不会发出警告了。
参考资料
本文译自Tour Of Scala – Implicit Conversions
上一篇:Scala之旅-隐式参数
下一篇:Scala之旅-多态方法