Kotlin编程实战:创建优雅、富于表现力和高性能的JVM与Android应用程序
上QQ阅读APP看书,第一时间看更新

6.3.3 智能转换

假设Animal类有一个age属性,我们需要在比较对象时使用该属性。在equals()方法中,参数的引用类型是Any,因此我们不能从该引用中直接获得age的值。如果我们在Java中编程,那么Animal类的equals()方法看起来是这样的:

使用instanceof来询问Java引用other的类型是否为Animal是不够的。此外,为了访问age,我们必须写成((Animal)(other)).age。代码片段中的那个Java特性叫什么?

惩罚,但有些人称之为转换。

一旦确定了引用的类型,Kotlin就可以执行自动或智能转换。让我们修改之前编写的Animal类来把age包括进来,然后修改equals()方法:

在equals()方法中,我们可以直接使用other.age,而不需要任何转换。这是因为在if表达式的条件中,Kotlin确认了other是Animal的一个实例。如果你试图访问if之前的other.age,你将会收到一个编译错误。但是一旦你为is检查付费了,那么可以说,你就免费得到了转换。

在进一步重构以减少一些混乱之前,让我们在一个示例中使用这个修改后的Animal类。

该示例确认了使用智能转换进行类型检查的行为。只要Kotlin确定了类型,智能转换就会起作用。例如,它也可以用在||和&&运算符之后,而不仅仅用于if表达式。

让我们重构我们写的equals()方法来使用这个功能:

Kotlin将在可能的情况下自动应用智能转换。如果它可以确定引用的类型是特定类型,那么它将允许你避免使用转换。同样,一旦Kotlin确定了一个对象引用不为空,它就可以应用智能转换,来自动将可空类型转换为不可空类型,从而再次省去了显式转换。