java - 根据JAVA中的属性检查两个对象是否相同

标签 java

例如:

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 以维持其契约...

来自JavaDocs for Object#equals

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/

相关文章:

java - Guice 运行时依赖参数重新注入(inject)

JavaFX 自定义 ListView

java - 在 JodaTime 中生成日期范围

java - 如何在 Android Studio IDE 中找到我项目中所有未使用的方法?

java - 我可以避免使用堆叠 if 语句吗

java - java中的dom文档字符串

java - 每次在字符串上使用 replaceAll() 时都会创建一个新字符串吗?

javafx 的东西,我不能做出好的标题

java - Java中解压PHP的gzcompress

java - Java中类的构造函数中的参数有什么问题?