例如:
public class Fruit{
private String color;
private double weight;
...
public boolean equals(Fruit a){
return (this.getColor().equals(a.getColor()) && (this.getWeight()==a.getWeight()));
}
}
public class Orange extends Fruit{
public Orange(double weight) {
super("orange", weight);
}
}
public class NavalOrange extends Orange{
public NavalOrange(double weight) {
super(weight);
}
}
然后我编写了一个关于此的测试来检查两个对象是否相同。
Orange orange = new Orange(8);
NavalOrange navalOrange = new NavalOrange(8);
assertEquals(orange, navalOrange);
但它只是不断返回错误:
junit.framework.AssertionFailedError: expected:<Orange@5305068a> but was:<NavalOrange@1f32e575>
谁能解释一下为什么会发生这种情况?我认为 toString
方法可能有问题。
最佳答案
Object
中没有 equals(Fruit)
方法。你的equals
方法应该以类似...的方式开始
@Override
public boolean equals(Object a) {
boolean equals = false;
if (a instanceof Fruit) {
...
}
return equals;
}
基本上,所有 assertEquals
所做的都是使用 Object#equals
。您可以通过将 @Override
注释添加到您的 equals
方法来测试这一点,它将产生编译器错误,因为 `equals(Fruit) 不会覆盖其父级的任何方法...
此外,如果您重写 equals
,则应该重写 hashCode
以维持其契约...
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
关于java - 根据JAVA中的属性检查两个对象是否相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26457167/