为什么在 Java 中进行类型转换之前验证 obj class 与实例 class 不匹配?

Why verify obj class does not match instance class before typecasting in Java?

我想使用自定义的 equals 方法比较两个人的统计数据,该方法将覆盖对象 class 中的 equals 方法。由于此 equals 方法的 return 类型将是一个布尔值,我知道我需要传入 (Object obj) 参数。当我定义新的 equals 方法时,我被告知我需要首先检查对象 class 是否与实例 class 不匹配。验证后,我将 obj class 类型转换为实例 class,然后可以继续执行其余代码。

但是,我不明白为什么我需要验证对象 class 与实例 class 不匹配。我认为这两个 classes 应该不匹配,因此需要进行类型转换。

谁能告诉我为什么我们需要验证对象 class 与实例 class 不匹配?我正在处理的代码写在下面。

public boolean equals(Object obj) {
    if (obj == null || obj.getClass() != this.getClass())
        return false;
    else {
        Person pp2 = (Person) obj;

        if (this.name.equals(pp2.name) && this.age == pp2.age)
            return true;
        else
            return false;
    }
}

public static void main(String[] args) {
     Person ps1 = new Person("Buddy", 14);
     Person ps2 = new Person("Buddy", 14);

     if (ps1.equals(ps2))
        System.out.println("Same");
}

你建议做的是:

public boolean equals(Object obj) {
    Person pp2 = (Person) obj;
    return (this.name.equals(pp2.name) && this.age == pp2.age);
}

这将违反 equals() 方法契约,该契约明确规定当两个对象不相等时该方法必须 return false。此处情况并非如此:该方法将抛出 ClassCastException(如果 obj 为 null,则抛出 NullPointerException)。

如果您不检查另一个 obj 的类型,那么当有人呼叫

时您可能会收到 ClassCastException
new Person("Jim",12).equals(new ArrayList())

你不想要那个。你想要 return false 而不是崩溃。

您可以使用:

if (obj instanceof Person){
}