为什么必须使用 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
,但是编译器不够智能,无法将这些点连接起来。它只知道 compared
是 Object
.
类型
在 equals() 函数中,正在检查实际值而不是地址假设变量 a 包含数据 121,变量 b 包含数据 121.00 因此 a 是整数类型,b 是浮点类型,因此在匹配时将 return false tleven 尽管值相同,这就是我们需要类型转换的原因
我正在做 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
,但是编译器不够智能,无法将这些点连接起来。它只知道 compared
是 Object
.
在 equals() 函数中,正在检查实际值而不是地址假设变量 a 包含数据 121,变量 b 包含数据 121.00 因此 a 是整数类型,b 是浮点类型,因此在匹配时将 return false tleven 尽管值相同,这就是我们需要类型转换的原因