
6.3.2 使用is
对象的equals()方法执行基于引用的比较,但是类可以重写该方法来确定是否相等。延续这一传统,所有从Any类(在6.1.1节中讨论过)扩展来的Kotlin类都可以重写equals()方法。我们在2.4节中也看到,Kotlin将==运算符映射到equals()方法。尽管我们还没有研究过Kotlin中的类,但为了探索类型检查,让我们继续在类中实现equals()方法。
在下面的代码中,Animal类用实现重写了equals()方法,该实现希望将所有Animal实例都视为平等的。但是如果给定的参数必须是Any?类型该怎么办?由于被Any重写的方法的签名不是Animal的实例,因此它希望返回false。

is运算符用于检查引用所指向的对象(本例中的other)是否属于特定类型(本例中为Animal)。如果实例是预期的类型,那么该表达式的结果为true,否则为false。
让我们在另一个例子中使用equals()方法:

在2.4节中,我们看到了==和===之间的区别。在本例中,我们使用==运算符访问equals()方法。用一个String比较Animal的实例会返回false,但是比较Animal的两个实例会返回true。本例中的所有引用都是Any类型。如果引用类型属于特定类类型——例如,如果greet引用被定义为类型String,而odie引用被定义为类型Animal——那么由于从源代码中检测到的类型不匹配,Kotlin编译器将在相等检查时出错。我们将引用类型保持为Any来避开那个检查,以说明类型检查。
is运算符可以用于任何类型的引用。如果引用为null,那么使用is运算符的结果为false。但如果实例是在is之后指定的类型或其派生类型之一,那么结果为true。
你也可以使用带否定的is运算符。例如,你可以使用other !is Animal来检查给定的引用是否指向Animal的实例。
Kotlin提供了“买一送一”的优惠——如果你购买了is或!is的使用,那么你可以免费得到转换。让我们来看一看。