Scala之旅-隐式转换

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之旅-多态方法

发表评论

电子邮件地址不会被公开。 必填项已用*标注