所以我有这样的设置:
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
方法正常运行?
答案 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
方法协同工作以检查相等性。其稳健的确认方式。