You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中重写Any类equals()方法:为何需判断other is Person?

为什么重写equals时必须用if (other is Person)才能访问属性?

这事儿本质是类型匹配与智能转型的问题,拆成两点说:

  1. equals方法的参数类型限制
    你重写的equals方法来自Kotlin的根类Any,它的参数是Any?——这意味着传入的other可以是任何对象(甚至null)。而Any类本身并没有firstName这个属性,编译器根本不知道other到底是什么类型,直接写other.firstName自然会报错,因为编译器找不到这个属性的定义。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:22:33