我有一个名为Xpto 的抽象类和两个扩展它的子类Person 和Car。我还有一个名为 Test 的类,带有 main() 和一个方法 foo() 来验证两个人或汽车(或扩展 Xpto 的类的任何对象)是否等于。因此,我在 Person 和 Car 类中重新定义了 equals()。两个人同名是平等的,两车同号也是平等的。
但是,当我在测试类中调用 foo() 时,我总是得到“false”。我明白为什么:equals() 没有在 Xpto 抽象类中重新定义。那么...如何在 foo() 方法中比较两个人或汽车(或扩展 Xpto 的类的任何对象)?
总而言之,这是我的代码:
public abstract class Xpto {
}
public class Person extends Xpto{
protected String name;
public Person(String name){
this.name = name;
}
public boolean equals(Person p){
System.out.println("Person equals()?");
return this.name.compareTo(p.name) == 0 ? true : false;
}
}
public class Car extends Xpto{
protected String registration;
public Car(String registration){
this.registration = registration;
}
public boolean equals(Car car){
System.out.println("Car equals()?");
return this.registration.compareTo(car.registration) == 0 ? true : false;
}
}
public class Teste {
public static void foo(Xpto xpto1, Xpto xpto2){
if(xpto1.equals(xpto2))
System.out.println("xpto1.equals(xpto2) -> true");
else
System.out.println("xpto1.equals(xpto2) -> false");
}
public static void main(String argv[]){
Car c1 = new Car("ABC");
Car c2 = new Car("DEF");
Person p1 = new Person("Manel");
Person p2 = new Person("Manel");
foo(p1,p2);
}
}
最佳答案
正如其他人所说,您重写的方法的签名必须完全相同。覆盖方法时,为确保您正在覆盖,请在函数上方使用 @Override
注释,这样如果您更改了方法,像 Eclipse 这样的 IDE 会警告您。
这是它的样子:
@Override
public boolean equals(Object obj){
...Your code here...
}
我建议也重写 hashCode()
,因为在将项目插入列表、集合、hastables 等时...为了相等(和执行)hashCode()
被使用(有时 equals()
不是!)
所以你的最终代码是:
@Override
public boolean equals(Object obj){
...Your code here...
}
@Override
public int hashCode(){
...Your code here...
}
更多信息请访问 javadoc
关于Java - 抽象类、equals() 和两个子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2698419/