20.1 隐式转换规则

2016-05-08 12:01:37 2,258 0


隐式转换在如下三种不同的情况会被考虑:

1、当对象A调用某个方法时,这个方法不存在

例如在前一节介绍的1 to 10。会将Int转换为RichInt,然后再调用to方法。

在这种情况下,会将对象A(方法的调用者)隐式转换为另一个对象。

2、当对象A调用某个方法,这个方法也存在,但是方法的参数类型不匹配

假设我们为Test类定义了一个方法:

class Test{
   def print(a:A){//接受类型为A的参数
     ...
   }
}
class A{...}
class B{...}

当我们调用A的print方法时,传入的却是另一个类型B

val a= new A
val b=new B
a.print(b)//传入的参数类型不匹配

在参数类型不匹配的情况下,scala编译器将会自动尝试将B的实例b转换为A的实例。

即这种情况下,是将方法的参数进行类型转换。

3、当表达式的类型与预期的类型不同

这只是第一、二种方式的扩展。因为表达式总是会返回一个值。

当我们利用表达式返回的值调用方法时,实际上是第一种方式进行的自动转换。如:

scala> (if (1>0) 1 else 0) to 10
res1: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

当我们将表达式当做一个方法的参数时,如果不匹配,也会进行自动转换。


上面已经介绍了隐式转换的三个规则,即什么情况下会发生隐式转换。下一节我们将介绍如何实现隐式转换,这需要通过一个隐式转换函数