-- 是的,这是一个关于家庭作业的问题,寻求帮助。不,这不是我要你帮我做作业。截止日期是半小时前;我真的无法更改我的提交。你只需要相信我的话。继续……
我知道不需要测试对象的类型。当我寻找有关“instanceof”的详细信息时,我发现了六个线程,其中人们的回应只是告诉原始发帖人,如果他们必须在处理之前进行测试以找出他们正在处理的对象类型,那么他们就犯了一个错误它。是的,我知道,我愿意遵守惯例。不幸的是,我的教授要求我们覆盖我们定义的类的 equals 方法,并且特别需要一个 Object 类型参数。如果你看到我的代码,你可能会更好地理解:
public boolean equals(Course other){
if(!(other instanceof Course)){
return false;
} else if(other.name==this.name && other.days==this.days &&
other.start==this.start && other.end==this.end){
return true;
}
return false;
}
您可能会明白我的意思。 “其他”参数应该是对象类型,但如果我将其保留为对象并使用名称/天数/开始/结束字段,则该程序很合适。如果我将其更改为 Course,当然可以(没有双关语意),但那将是一种完全不同的方法。期望的行为是对于除 Course 实例之外的所有对象,使该方法返回 false,此外,对于 Course 实例之间不匹配的数据,使其返回 false。
对于所有非常了解 Java 的人,看到这些问题感到沮丧,我深表歉意。
最佳答案
如果您想覆盖“equals”方法,您应该使用 Object 作为参数,因此您必须检查对象的类型。通常你自己的实现看起来像这样:
@Override
public boolean equals(Object obj) {
if (obj == this)
return true; // object's references are identical
else if (!(obj instanceof Course))
return false;
Course that = (Course) obj;
return (this.name.equals(that.name)) && (this.days == that.days)
&& (this.start.equals(that.start)) && (this.end.equals(that.end));
}
当然,您也应该使用相同的重要字段覆盖“hashCode”。
相反,您使用自己的 Course 类型参数重载该方法。因此,如果您调用 myobject.equals(anotherObject)
并且 anotherObject
不是 Course 类型,您的“equals”方法将永远不会被调用,而是Object#equals
方法将被调用,它仅执行以下操作:return this == obj
.
重载“equals”方法还不够的原因是还需要重载“hashCode”,它没有参数,因此不能重载。
- 如果您自己编写
boolean equals(Object)
的实现,您必须还实现int hashCode()
- 这两种方法都应该对“hashCode”和“equals”使用相同的重要字段。
- 如果
a.equals(b) == true
则以下必须也为真:a.hashCode() == b.hashCode()
- 另外,如果
a.hashCode() != b.hashCode()
那么a.equals(b) == false
最后一点是你不应该用你自己的类型重载“equals”的主要原因:
Course c1 = new Course("myname");
Course c2 = new Course("myname");
c1.equals(c2); // true
c1.hashCode() == c2.hashCode(); // false
关于java - 在采用 Object 参数的 Java 方法中,您如何访问仅存在于特定类实例的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9901195/