与Java泛型相等:不调用子类equals

时间:2014-01-05 03:39:58

标签: java

我有一个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());
}

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

我拿着的对象是Token。我的Token.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<Token>.equals() 调用Token.equals,并且我已验证调试器是否会逐步执行第return obj.equals(other.getObject());行。

当我宣布Node.equals时,我的Token.equals为何不致电Node<Token>

4 个答案:

答案 0 :(得分:3)

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

public boolean equals(Object obj)

当您覆盖equals方法时,您也应该覆盖hashCode方法。这是所有对象应遵循的合同。

为了防止出现这种错误,最好添加@Override注释。

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

答案 1 :(得分:2)

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

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

添加@Override注释以捕获它。

答案 2 :(得分:0)

equals方法必须使用Object类型作为参数才能覆盖父类equals方法。它还应返回原始boolean类型。

答案 3 :(得分:0)

您需要以这种方式覆盖equals方法:

@Override
  public boolean equals(Object object) {

    // add your logic here
  }

您还需要覆盖hashCode方法。这是合同:

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