【发布时间】:2014-07-23 20:42:02
【问题描述】:
我有下面这样的课程
class A {
@Override
public boolean equals(Object other) { return true }
}
Class B extends A {
}
Class C extends A {
@Override
public boolean equals(Object other) { if ((other != null) || (other instanceOf B)) return false; }
}
In my main() I have this following code
Set<A> mySet = new CopyOnWriteArraySet<A>();
mySet.add(C);
I want mySet to contain C at this point
mySet.add(B); // #1
I want mySet to contain C & B at this point
mySet.remove(B); // #2
I want mySet to contain C at this point
我想创建一个全局队列,如果队列 B 中存在对象 C,则应该允许添加,但不能反过来。所以在#1 之前,我循环遍历集合中的元素,执行 element.equals(B) 并添加 false。
但是 1 正在调用返回 true 的 B.equals(C),因此 mySet 在这一行之后只有一个 C 对象
2 再次调用 B.equals(C) ,它返回 true 并删除现有对象 C。在这种情况下不应该是 C.equals(B) 吗?我希望这条线没有行动
这是对 CopyOnWriteArraySet 的错误使用吗?
感谢观看
【问题讨论】:
-
你的
equals方法实现不正确,所以依赖于equals的 Collections API 中的各种事情都会出现异常。 -
equals 必须是关联的,如 Object.equals() 中所述,即 a.equals(b) == b.equals(a) 否则您会感到困惑。
-
另外,
Object.equals(null)应该总是返回false。 -
让我重新提出我的问题,关于我打算在我的情况下做什么
-
@PeterLawrey 这是对称的,不是关联的
标签: java equals copy-on-write