0

我有如下课程

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 的错误使用吗?

感谢您的关注

4

2 回答 2

2

这是正确的行为,它找到了元素,equal()所以它删除了第一个元素

如果存在,则从此集合中删除指定的元素。更正式地说,删除一个元素 e 使得(o==null ? e==null : o.equals(e)),如果这个集合包含这样一个元素。如果此 set 包含该元素(或等效地,如果此 set 由于调用而更改),则返回 true。(一旦调用返回,该集合将不包含该元素。)...

于 2014-07-23T20:43:58.950 回答
0

HashSet 是适合我的情况的正确集合。除非有 hashCode 匹配,否则在添加元素时它不会调用 equals。这样我仍然可以将我的 equals 方法用于我的特定目的。

于 2014-07-23T21:35:00.323 回答