为什么必须使用 equals ?

Why is casting in equals necessary?

我正在做 Mooc course,它教我们如何比较来自 类 和 "Person" 的对象,看看它们是否相等。他们给了我们以下代码:

public class SimpleDate {
private int day;
private int month;
private int year;

public SimpleDate(int day, int month, int year) {
    this.day = day;
    this.month = month;
    this.year = year;
}

public int getDay() {
    return this.day;
}

public int getMonth() {
    return this.month;
}

public int getYear() {
    return this.year;
}

public boolean equals(Object compared) {
    // if the variables are located in the same position, they are equal
    if (this == compared) {
        return true;
    }

    // if the type of the compared object is not SimpleDate, the objects are not equal
    if (!(compared instanceof SimpleDate)) {
        return false;
    }

    // convert the Object type compared object
    // into an SimpleDate type object called comparedSimpleDate
    SimpleDate comparedSimpleDate = (SimpleDate) compared;

    // if the values of the object variables are the same, the objects are equal
    if (this.day == comparedSimpleDate.day &&
        this.month == comparedSimpleDate.month &&
        this.year == comparedSimpleDate.year) {
        return true;
    }

    // otherwise the objects are not equal
    return false;
}

@Override
public String toString() {
    return this.day + "." + this.month + "." + this.year;
}

}

对于 equals 方法,我知道他们首先使用 == 进行比较,以检查它是否在同一位置。接下来,他们会查看比较的对象是否与您要比较的对象是同一类型的对象 - 如果不是 return false。之后,他们将比较对象转换为您要比较的对象类型,然后比较其中的值。 我的问题是,当您已经将 return false 转换为不同类型的对象时,转换比较对象有什么意义?没有

`SimpleDate comparedSimpleDate = (SimpleDate) compared;`

好像没有必要?

这条线是必须的。否则你无法访问它的数据和方法。


Java 不允许您执行 compared.getYear()compared.year,因为您所知道的 compared 是一个 Object。所以它可能是 Cat 没有 getYear() 方法,编译器无法知道。

因此,你必须进行转换,这意味着"Hey compiler, trust me, I know that this is actually a SimpleDate, so please allow me to treat it as one"。顺便说一句,如果它实际上不是 SimpleDate.

,它会在运行时崩溃

当然,您之前检查过它实际上是一个 SimpleDate,但是编译器不够智能,无法将这些点连接起来。它只知道 comparedObject.

类型

在 equals() 函数中,正在检查实际值而不是地址假设变量 a 包含数据 121,变量 b 包含数据 121.00 因此 a 是整数类型,b 是浮点类型,因此在匹配时将 return false tleven 尽管值相同,这就是我们需要类型转换的原因