我有一个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>
?答案 0 :(得分:3)
您的equals
方法应具有以下签名:
public boolean equals(Object obj)
当您覆盖equals
方法时,您也应该覆盖hashCode
方法。这是所有对象应遵循的合同。
为了防止出现这种错误,最好添加@Override
注释。
或者您可以使用lombok通过@EqualsAndHashCode
注释简化equals
和hashCode
方法的定义。
答案 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;
}