繁体   English   中英

覆盖等于方法

[英]Overriding equals method

所以我有这样的设置:

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;
    }

但是我相信这会在调用values.equals(other.values)情况下调用Objectequals方法,因为它的行为不正确。

如何使Dequals方法正确运行?

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

为了模拟equals()您需要更改签名,像这样,

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

如果您使用的是Eclipse之类的IDE,并且不需要实现自定义规则来实现相等性,则可以让Eclipse为您实现该方法。 只需查找“覆盖等于和hashCode”选项。 它应位于“源”或“源>重构”下。

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

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

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

equals方法可从Object类获得。 因此,它在所有具体的Java类中都可用。 equals方法的签名为public boolean equals(Object equals)

同样, equals方法应与hashcode方法协同工作以检查相等性。 其强大的确认方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM