2017-04-12 6 views
-2

sur mon IDE (eclipse neon) en cours d'exécution jre 1.8. Comme vous pouvez le voir dans le code de l'extrait ci-dessous, j'ai développé ma classe Personnalisée en remplaçant la méthode equals. C'est la raison pour laquelle je veux utiliser ma version surchargée lorsque j'exécute la méthode removeAll d'un Set de ma classe personnalisée. En regardant dans le code source jdk, il est possible de vérifier que la méthode removeAll utilise la méthode contains qui utilise à son tour la méthode equals de la classe Object. En lançant ce code, je me rends compte que la méthode equals substituée n'est jamais appelée.Java 1.8 substitué est égal à() non appelé par Collection removeAll()

Qu'est-ce qui ne va pas?

Merci

+1

Quel genre de jeu mise en œuvre utilisez-vous? Notez que si vous substituez equals, vous devez également remplacer hashCode pour être cohérent. Ceci est probablement votre problème. –

+1

Copie possible de [Pourquoi ai-je besoin de remplacer les méthodes equals et hashCode en Java?] (Http://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals-and -hashcode-methods-in-java) –

Répondre

0

Pour que cela fonctionne correctement, vous devez passer outre hashCode ainsi:

@Override 
public int hashCode() { 
    return Objects.hash(getConnectionID()); 
} 
+0

* Attention! * si votre égalité est implémentée avec 'equalsIgnoreCase', le code de hachage doit également être insensible à la casse, ce que cette implémentation n'offre pas. Cependant, dans ce cas, il est très probable que la comparaison d'ID ne soit pas supposée être insensible à la casse. Donc l'implémentation de 'equals' peut être corrigée et simplifiée en' return (obj instance de MyClass) && ((MyClass) obj) .getConnectionID(). Est égal à (this.getConnectionID())); – Holger