Подтвердить что ты не робот

Переопределить равные для CopyOnWriteArraySet.add и удалить

У меня есть классы вроде ниже

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

Я хочу создать глобальную очередь, где, если объект C существует в очереди B, должен быть добавлен, но не наоборот. Поэтому перед # 1 я перебираю элементы внутри набора, делающие element.equals(B) с добавлением на false.

Но 1 вызывает B.equals(C), который возвращает true, и поэтому mySet имеет только один объект C после этой строки

2 снова вызывает B.equals(C), который возвращает true и удаляет существующий объект C. В этом случае не должно быть C.equals(B)? Я ожидаю, что эта строка будет no-action

Это неправильное использование CopyOnWriteArraySet?

Спасибо, что посмотрели

4b9b3361

Ответ 1

HashSet - это правильная коллекция для моего дела. Он не будет называть equals при добавлении элементов, если не будет hashCode. Таким образом, я могу использовать методы equals для моей конкретной цели.

Ответ 2

Правильное поведение обнаруживает элемент equal(), поэтому он удаляет первый элемент

Удаляет указанный элемент из этого набора, если он присутствует. Более формально удаляет элемент e такой, что (o==null ? e==null : o.equals(e)), если этот набор содержит такой элемент. Возвращает true, если этот набор содержит элемент (или, что то же самое, если этот набор изменился в результате вызова). (Этот набор не будет содержать элемент после вызова.) ...