【问题标题】:Equality with Java generics: the subclass equals isn't called [duplicate]Java泛型的平等:子类equals不被称为[重复]
【发布时间】:2014-01-05 03:39:57
【问题描述】:

我有一个 Node<T> 和一个 equals() 方法:

public boolean equals(Node<T> other) {
    if (this == other)
        return true;
    if (other == null)
        return false;
    if (!obj.getClass().equals(other.getObject().getClass()))
        return false;

    return obj.equals(other.getObject());
}

我只关心我的节点中保存的对象是否等于另一个节点中保存的对象(因为两个相等的对象可以保存在我的列表中的不同位置)。

我持有的对象是TokenToken.equals() 方法有效,而我的 Node.equals() 方法无效:

public class TokenEqualityTest {
    public static void main(String[] args) {
        Token t = new Token(0);
        Token q = new Token(0);
        System.out.println("t.equals(q): " + t.equals(q));

        Node<Token> tnode = new Node<Token>(null, null, t);
        Node<Token> qnode = new Node<Token>(null, null, q);
        System.out.println("tnode.equals(qnode): " + tnode.equals(qnode));
    }
}

哪个打印:

t.equals(q): true
tnode.equals(qnode): false

如果我在 Token.equals() 处设置断点并运行 eclipse 调试器,我的代码将停止一次(在 t.equals(q) 处)。这表明Node&lt;Token&gt;.equals() 确实 调用Token.equals,并且我已经验证调试器确实通过了return obj.equals(other.getObject()); 行。

当我声明了Node&lt;Token&gt; 后,为什么我的Node.equals 不调用Token.equals

【问题讨论】:

  • 您使用的是equals(Node&lt;T&gt; other),而基类的正确重载应该是equals(Object other)

标签: java


【解决方案1】:

您的equals 方法应具有以下签名:

public boolean equals(Object obj)

当你重写equals 方法时,你也应该重写hashCode 方法。这是所有对象都应该遵守的契约。

为了防止这种错误,最好加上@Override注解。

或者您可以使用lombok 通过@EqualsAndHashCode 注释来简化定义equalshashCode 方法。

【讨论】:

    【解决方案2】:

    我的通灵调试技能告诉我,你没有覆盖 Token 中的基本 equals() 方法,就像你在 Node 中没有覆盖一样。

    您需要将其声明为equals(Object)

    添加 @Override 注释来捕捉它。

    【讨论】:

      【解决方案3】:

      equals 方法必须将Object 类型作为参数才能覆盖父类的equals 方法。它还应该返回一个原始的boolean 类型。

      【讨论】:

        【解决方案4】:

        你需要这样重写equals方法:

        @Override
          public boolean equals(Object object) {
        
            // add your logic here
          }
        

        你还需要重写 hashCode 方法。这是合同:

         @Override
          public int hashCode() {
          return hashCode;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-12
          • 2011-08-17
          • 1970-01-01
          相关资源
          最近更新 更多