我有两个班级Person
和Teacher
。在Person
类中,我使用compareTo方法检查传入的两个对象是否相等。在Teacher
类中,我正在处理的问题表明我需要覆盖Person中的equals
方法。在这个equals
方法中,它返回true的唯一方法是它在equals
和Person
中的Teacher
方法中是否相等。我的问题是,当我检查Teacher
的{{1}}方法时,我是否只需调用equals
以检查父类是否相等这两个对象或还有什么我需要做的吗?
人:
super.equals(other)
教师
public class Person implements Comparable<Person> {
public boolean equals(Object other) {
try {
return this.compareTo(other) == 0;
}catch(Exception e) {
return false;
}
}
}
答案 0 :(得分:1)
基本上,Object#equals
的合同规定:
它是对称的:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true
Teacher#equals
的实施并不符合此要求。对于在继承自非equals
的另一个类的类中实现Object
方法的情况,例如Teacher
,您应该验证要比较的对象的类型是与您要比较的类相同。为此,您应该使用getClass().equals
:
public class Teacher extends Person {
private String facultyID;
@Override
public boolean equals(Object other) {
//this line is nonsense, not all Persons are Teachers
//boolean personEquals = super.equals(other);
//avoid using try-catch
//try {
//verify that the other object is not null
if (other == null) {
return false;
}
//verify that the other object is specifically a Teacher, not a super or a subclass of it
if (this.getClass().equals(other.getClass()) {
//here comes the real check
Teacher otherTeacher = (Teacher)other;
return this.facultyID.equals(otherTeacher.facultyID);
}
return false;
}
}
对Person
执行类似操作,以防它不允许与它的子类进行比较。