Ich kann nicht scheinen, dass eine HashSet
-Instanz wie erwartet funktioniert. Der Code, den ich verwendet habe, ist wie folgt:
Unterklasse
%Vor%Dieser Code gibt
aus %Vor% Sie müssen equals(Object)
überschreiben. Stattdessen haben Sie eine equals
-Methode mit der Signatur equals(Subclass)
implementiert. Folglich verwendet Ihre HashSet
die Standardmethode equals(Object)
, die für das Testen der Gleichheit in Object
definiert wurde.
Die standardmäßige equals(Object)
-Implementierung basiert auf der Objektidentität und daher erlaubt die Menge "erlaubt", zwei String
s hinzuzufügen, die, obwohl sie semantisch gleich sind, nicht das gleiche Objekt sind.
Zwei Meta-Punkte:
Erstens, gewöhnen Sie sich an, @Override
jedes Mal zu verwenden, wenn Sie glauben, dass Sie eine Methode außer Kraft setzen. Das hätte dazu geführt, dass Ihr Beispielcode nicht kompiliert werden konnte und Sie das Problem entdecken.
Zweitens, wenn Sie eine IDE verwenden und eine schöne, fette Warnung für Sie nicht hervorgehoben hat, ist sie falsch konfiguriert! Du solltest es reparieren!
Und wenn Sie keine IDE verwenden, sollten Sie wirklich, wirklich sein. Sobald Sie public boolean equals(Subclass other)
eingegeben haben, würde der Text seine Farbe ändern und eine Warnung würde angezeigt werden, die Ihnen sagt, was Ihr wahrscheinliches Problem ist.
Übrigens ist das Standardidiom für equals()
, auf das ich mich eingelassen habe, folgendes:
In einigen -Fällen lohnt es sich, ein if (object == this) { return true; }
voranzustellen, aber es ist wirklich nicht sinnvoll, sich regelmäßig daran zu gewöhnen.
Ich hatte fast das gleiche Problem, da alle sagten, dass Sie die richtige Methode public boolean equals(Object o)
überschreiben müssen. Aber das ist nicht genug!
Es ist auch notwendig, public int hashCode()
zu überschreiben (wie Sie es getan haben), andernfalls würde java die Methode equals
überhaupt nicht aufrufen.
Ihre equals-Methode wird nie aufgerufen. Die Signatur von equals
erfordert, dass es ein Object
braucht, nicht irgendeine andere Klasse (einschließlich der Klasse, die zufällig equals
implementiert).
Tags und Links java duplicates hashset