Kotlin中重写Any类equals()方法:为何需判断other is Person?
为什么重写equals时必须用
if (other is Person)才能访问属性? 这事儿本质是类型匹配与智能转型的问题,拆成两点说:
equals方法的参数类型限制
你重写的equals方法来自Kotlin的根类Any,它的参数是Any?——这意味着传入的other可以是任何对象(甚至null)。而Any类本身并没有firstName这个属性,编译器根本不知道other到底是什么类型,直接写other.firstName自然会报错,因为编译器找不到这个属性的定义。is关键字的双重作用if (other is Person)做了两件关键的事:
- 首先是类型检查:确认
other确实是Person类的实例,排除了null、String、Int这些其他类型的对象; - 其次是智能转型:一旦这个条件成立,Kotlin编译器会自动把
other的类型从Any?转为Person,这时候你就能直接访问Person类的firstName、lastName这些属性了,不用手动写强制转型。
举个反例:如果去掉这个判断,假设有人调用personObj1.equals("字符串"),代码不仅编译不过,就算强行通过编译,运行时也会因为类型不匹配抛出异常——类型检查就是为了避免这种情况,保证equals方法的安全性和正确性。
另外提一句,你现在的equals实现其实不完整,只比较了firstName,正确的写法应该同时比较firstName和lastName,还要先处理自身比较的情况(提升性能),完整的写法大概是这样:
override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is Person) return false return firstName == other.firstName && lastName == other.lastName }
内容的提问来源于stack exchange,提问作者Raghul G
相关产品推荐
相关产品推荐

