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

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

我想使用一个自定义的equals方法比较两个人的统计数据,该方法将覆盖对象类中的equals方法。因为这个equals方法的返回类型是一个布尔值,所以我知道需要传入(object obj)参数。当我定义新的equals方法时,我被告知我需要首先检查obj类是否与实例类匹配。一旦验证了这一点,我输入将obj类转换为实例类,并可以继续执行其余的代码。

但是,我不理解为什么我需要验证obj类与实例类不匹配。我认为这两个类应该不匹配,因此需要类型转换。

有人能告诉我为什么我们需要验证obj类与实例类不匹配吗?我正在处理的代码写在下面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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");
}


你建议做的是:

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

这将违反equals()方法契约,该契约明确指出,当两个对象不相等时,该方法必须返回false。这里不是这样的:该方法将改为抛出一个ClassCastException(或者,如果obj为空,则抛出一个NullPointerException)。


如果您不检查其他obj的类型,那么当有人呼叫时,您可能会得到ClassCastException

1
new Person("Jim",12).equals(new ArrayList())

你不想那样。你想返回错误而不是崩溃。


你可以使用:

1
2
if (obj instanceof Person){
}