覆盖equals方法

时间:2014-04-14 04:26:15

标签: java oop inheritance equals

所以我有这样的设置:

interface A{

}
class B implements A{
    public int hashCode() {
    ...
    }

    public boolean equals(final Object obj) {
    ...
    }
}
class C implements A{
    public int hashCode() {
    ...
    }

    public boolean equals(final Object obj) {
    ...
    }
}
class D{
    List<A> list = new ArrayList<A>();
}

我想为D类实现一个重写的equals方法来测试列表是否相等,但是出于某种原因,每当我尝试实现它时:

@Override
    public boolean equals(final Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;

        final D other = (D) obj;
        if (values == null) {
            if (other.values != null)
                return false;
        }else if (!values.equals(other.values))
            return false;
        return true;
    }

但我认为这会调用Object equals方法调用values.equals(other.values),因为它的行为不正确。

如何使D equals方法正常运行?

5 个答案:

答案 0 :(得分:2)

equals()是属于Object类的预定义方法。记住java是面向对象的编程语言,这意味着equals()方法隐含地适用于每个java类。您没有使用预定义的方法名作为自定义方法。

为了模拟equals()你需要改变签名,就像这样,

public boolean equals_simulation(final Object obj) {
   ...
}

答案 1 :(得分:1)

如果您使用的是Eclipse(如Eclipse),并且不需要实现相等的自定义规则,则可以让Eclipse为您实现该方法。只需查看“override equals和hashCode”选项即可。它应该在Source,或Source&gt;之下重构。

答案 2 :(得分:1)

实际上,您需要覆盖等于您在实际列表之间定义比较因子。

如果您使用Maven进行依赖关系管理,可以在这里找到Apache Commons Lang3,其中包含一个名为 EqualsBuilder 的便捷类,对于重写equals方法非常有用。

答案 3 :(得分:0)

您的上一次比较应使用Arrays.equals(list, ((D)other).list)来比较所有数组元素。 VSequence实际上是D吗?然后你可以将演员表放到D

答案 4 :(得分:0)

equals方法可从Object课程获得。所以它在所有具体的Java类中都可用。 equals方法的签名是public boolean equals(Object equals)

此外,equals方法应与hashcode方法协同工作以检查相等性。其稳健的确认方式。