J'ai des classes comme ci-dessousRedéfinition égale pour CopyOnWriteArraySet.add et enlever
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
Je veux créer une file d'attente globale où si l'objet C existe dans la file d'attente B devraient être autorisés à ajouter, mais pas dans l'autre sens autour. Donc avant # 1, je fais une boucle sur les éléments à l'intérieur de l'ensemble en faisant element.equals (B) avec add on false.
Mais 1 appelle B.equals (C), qui retourne vrai et si mySet n'a qu'un seul objet C après cette ligne
2 est à nouveau B.equals appellent (C), qui retourne vrai et le retrait l'objet existant C. Ne devrait-il pas être C.equals (B) dans ce cas? Je m'attends à cette ligne comme aucune action
Est-ce une mauvaise utilisation de CopyOnWriteArraySet?
Merci pour la recherche
Bien que votre méthode 'equals' ne soit pas correctement implémentée, toutes sortes de choses dans l'API Collections qui reposent sur' equals' vont se comporter de façon inattendue. – markspace
égal doit être associatif comme documenté dans Object.equals() c'est-à-dire a.equals (b) == b.equals (a) sinon vous aurez de la confusion. –
De plus, 'Object.equals (null)' devrait toujours retourner 'false'. – yshavit