例如:
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
方法可能有问题。
答案 0 :(得分:2)
equals(Fruit)
中没有Object
方法。你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
以维持合同......
请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。