1 回答
TA贡献1775条经验 获得超11个赞
调用IdentityWrapper.equals()方法时。LinkedHashSet不会传递的而是ELEM一个IdentityWrapper对象。
您必须引入额外的检查 ( instanceOf),然后打开传递的对象以比较元素:
public boolean equals(Object obj) {
return (obj instanceof IdentityLinkedHashSet<?>.IdentityWrapper) &&
ELEM == ((IdentityLinkedHashSet<?>.IdentityWrapper) obj).ELEM;
}
一些注意事项:
instanceof将检查 null,因此您可以完全删除该检查。
你必须IdentityWrapper像这样引用:IdentityLinkedHashSet<?>.IdentityWrapper因为它不是一个static类。如评论中所述。可以将其设为静态,并且可以将其类型ELEM从 更改E为Object。您还会用更好的equals方法离开哪个:
private static class IdentityWrapper {
public final Object ELEM;
IdentityWrapper(Object elem) {
this.ELEM = elem;
}
@Override
public boolean equals(Object obj) {
return (obj instanceof IdentityWrapper) && ELEM == ((IdentityWrapper) obj).ELEM;
}
@Override
public int hashCode() {
return System.identityHashCode(ELEM);
}
}
添加回答
举报