我的Emp课程中有两种方法
class Emp
{
String empId;
public boolean equals(Emp e){..}
public boolean equals(Object o){..}
public int hashCode(){
return empId.hashCode();
}
}
现在,如果我正在尝试将Emp对象添加到HashSet<Emp>
。
如果我查看HashMap的putVal方法的代码,该方法用于比较和设置值。代码永远不会将传递的对象强制转换为java.lang.Object
。所以每次调用equals(Emp)
版本时都会这样。
但每次equals(Object o)
被调用。我想知道这个Emp何时转换为java.lang.Object,以便equals(Object o)
调用每个时间。
以下是我使用的putval片段:
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
else {
Node<K,V> e; K k;
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
else if (p instanceof TreeNode)
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
....
}
答案 0 :(得分:3)
编译器会删除泛型类型参数,因此编译代码时K
和V
会变为Object
。因此key.equals(k)
执行equals(Object o)
。
答案 1 :(得分:2)
超越伊兰的正确论据;重点是不要。
请勿超载 public boolean equals(Object)
!
这是一种在Java中具有非常明确且清晰且已知的合同的方法。添加您自己的公开equals(Emp)
仅会增加您创建错误的风险。
如果有的话,将该方法设为私有;并在equals(Object)
方法中调用它。
你知道,重载是一个应该非常谨慎使用的概念,因为所有这些都发生在编译时间;特别是当它与多态性结合时,在运行时可能会发生意想不到的事情(正如您刚才所了解的那样)。