Ich versuche, die Methode equals in Java zu überschreiben. Ich habe eine Klasse, People
die im Grunde 2 Datenfelder hat name
und age
. Jetzt möchte ich die equals
Methode überschreiben , damit ich zwischen 2 Personenobjekten prüfen kann.
Mein Code lautet wie folgt
public boolean equals(People other){
boolean result;
if((other == null) || (getClass() != other.getClass())){
result = false;
} // end if
else{
People otherPeople = (People)other;
result = name.equals(other.name) && age.equals(other.age);
} // end else
return result;
} // end equals
Aber wenn ich schreibe age.equals(other.age)
, gibt es mir einen Fehler, da die Methode equals nur String vergleichen kann und age Integer ist.
Lösung
Ich habe den ==
Operator wie vorgeschlagen verwendet und mein Problem ist gelöst.
java
overriding
equals
Biber
quelle
quelle
Antworten:
Ausgabe:
quelle
hash = 53 * hash
Grund, warum Sie das verwenden?getClass()
wird Probleme verursachen, wenn die Klasse in Unterklassen unterteilt und mit einem Objekt der Superklasse verglichen wird.hashCode()
instanceof
Operator oder zu verwendenisAssignableFrom
. Dies erfordert eine genaue Typübereinstimmung anstelle einer Untertypübereinstimmung. - Symmetrische Anforderung.String
Sie können auch andere Objekttypen vergleichen oder verwendenObjects.equals(this.name,other.name)
.Die Einführung einer neuen Methodensignatur, die die Parametertypen ändert, wird als Überladung bezeichnet :
Hier
People
ist anders alsObject
.Wenn eine Methodensignatur mit der ihrer Oberklasse identisch bleibt, wird sie aufgerufen Überschreiben bezeichnet, und die
@Override
Annotation hilft beim Kompilieren, die beiden zu unterscheiden:Ohne die tatsächliche Erklärung von zu sehen
age
, ist es schwierig zu sagen, warum der Fehler auftritt.quelle
Ich bin mir der Details nicht sicher, da Sie nicht den gesamten Code gepostet haben, aber:
hashCode()
undequals
Methode sollteObject
nichtPeople
als Argumenttyp verwendet werden. Im Moment überladen Sie die equals-Methode und überschreiben sie nicht. Dies ist wahrscheinlich nicht das, was Sie wollen, insbesondere, wenn Sie den Typ später überprüfen.instanceof
damit überprüfen, ob es sich um ein People-Objekt handelt, zif (!(other instanceof People)) { result = false;}
equals
wird für alle Objekte verwendet, jedoch nicht für Grundelemente. Ich denke du meinst Alter ist einint
(primitives), in diesem Fall nur verwenden==
. Beachten Sie, dass eine Ganzzahl (mit einem Großbuchstaben 'I') ein Objekt ist, das mit gleich verglichen werden sollte.Siehe Welche Probleme sollten beim Überschreiben von equals und hashCode in Java berücksichtigt werden? für mehr Details.
quelle
quelle
Punkt 10: Befolgen Sie den allgemeinen Vertrag, wenn Sie das Gleiche überschreiben
Jede Instanz der Klasse ist von Natur aus eindeutig . Dies gilt für Klassen wie Thread, die aktive Entitäten anstelle von Werten darstellen. Die von Object bereitgestellte gleichwertige Implementierung hat genau das richtige Verhalten für diese Klassen.
Es ist nicht erforderlich, dass die Klasse einen „logischen Gleichheitstest“ bereitstellt. Zum Beispiel könnte java.util.regex.Pattern gleich überschrieben werden, um zu überprüfen, ob zwei Musterinstanzen genau denselben regulären Ausdruck darstellen, aber die Designer glaubten nicht, dass Clients diese Funktionalität benötigen oder wollen würden. Unter diesen Umständen ist die von Object geerbte gleichwertige Implementierung ideal.
Eine Oberklasse hat bereits gleich überschrieben, und das Verhalten der Oberklasse ist für diese Klasse geeignet. Beispielsweise erben die meisten Set-Implementierungen ihre gleichwertige Implementierung von AbstractSet, List-Implementierungen von AbstractList und Map-Implementierungen von AbstractMap.
Die Klasse ist privat oder paketprivat , und Sie sind sicher, dass die Methode equals niemals aufgerufen wird. Wenn Sie extrem risikoavers sind, können Sie die Methode equals überschreiben, um sicherzustellen, dass sie nicht versehentlich aufgerufen wird:
Das
equals
Methode implementiert eine Äquivalenzbeziehung. Es hat diese Eigenschaften:Reflexiv: Für jeden Referenzwert ungleich Null
x
giltx.equals(x)
muss true zurückgeben.Symmetrisch: Für alle Nicht-Null-Referenzwerte
x
undy
,x.equals(y)
muss wahr zurück , wenn und nur wenn y.equals (x) true zurückgibt.Transitive: Für alle Nicht-Null - Referenzwerte
x
,y
,z
, wennx.equals(y)
Erträgetrue
undy.equals(z)
Renditentrue
, dannx.equals(z)
muss zurückkehrentrue
.Konsistent: Für alle Nicht-Null-Referenzwerte
x
undy
müssen mehrere Aufrufe vonx.equals(y)
konsistenttrue
oder konsistent zurückgegeben werdenfalse
, sofern keine Informationen geändert werden, die in Vergleichen gleich verwendet werden.Für jeden Nicht-Null - Referenzwert
x
,x.equals(null)
zurückgeben mussfalse
.Hier ist ein Rezept für eine qualitativ hochwertige Gleichstellungsmethode:
Verwenden Sie den
==
Operator, um zu überprüfen, ob das Argument auf dieses Objekt verweist. Wenn ja, geben Sie true zurück. Dies ist nur eine Leistungsoptimierung, die sich jedoch lohnt, wenn der Vergleich möglicherweise teuer ist.Verwenden Sie den
instanceof
Operator, um zu überprüfen, ob das Argument den richtigen Typ hat. Wenn nicht, geben Sie false zurück. In der Regel ist der richtige Typ die Klasse, in der die Methode auftritt. Gelegentlich handelt es sich um eine von dieser Klasse implementierte Schnittstelle. Verwenden Sie eine Schnittstelle, wenn die Klasse eine Schnittstelle implementiert, die den Gleichheitsvertrag verfeinert, um Vergleiche zwischen Klassen zu ermöglichen, die die Schnittstelle implementieren. Sammlungsschnittstellen wie Set, List, Map und Map.Entry verfügen über diese Eigenschaft.Verwandeln Sie das Argument in den richtigen Typ. Da dieser Besetzung eine Testinstanz vorausging, ist der Erfolg garantiert.
Überprüfen Sie für jedes "signifikante" Feld in der Klasse, ob dieses Feld des Arguments mit dem entsprechenden Feld dieses Objekts übereinstimmt. Wenn alle diese Tests erfolgreich sind, geben Sie true zurück. Andernfalls geben Sie false zurück. Wenn der Typ in Schritt 2 eine Schnittstelle ist, müssen Sie über Schnittstellenmethoden auf die Felder des Arguments zugreifen. Wenn der Typ eine Klasse ist, können Sie möglicherweise direkt auf die Felder zugreifen, abhängig von ihrer Zugänglichkeit.
Verwenden Sie für primitive Felder, deren Typ nicht
float
oder istdouble
, den==
Operator für Vergleiche. Rufen Sie für Objektreferenzfelder dieequals
Methode rekursiv auf.float
Verwenden Sie für Felder die statischeFloat.compare(float, float)
Methode. und fürdouble
Felder verwendenDouble.compare(double, double)
. Die spezielle Behandlung der Schwimmer und Doppel Felder sind durch die ExistenzFloat.NaN
,-0.0f
und die analogen Doppelwerte; Während Siefloat
unddouble
Felder mit den statischen MethodenFloat.equals
und vergleichen könntenDouble.equals
, würde dies bei jedem Vergleich ein Autoboxing bedeuten, was eine schlechte Leistung hätte. Wenden Sie fürarray
Felder diese Richtlinien auf jedes Element an. Wenn jedes Element in einem Arrayfeld von Bedeutung ist, verwenden Sie eine derArrays.equals
Methoden.Einige Objektreferenzfelder können rechtmäßig enthalten
null
. Um die Möglichkeit eines zu vermeidenNullPointerException
, überprüfen Sie solche Felder mit der statischen Methode auf GleichheitObjects.equals(Object, Object)
.quelle
hashCode()
. Auch zur Kenntnis, dass seit Java7 Schreibenequals()
undhashCode()
Methoden ist wesentlich einfacher geworden durch den EinsatzObjects.equals()
,Arrays.equals()
undObjects.hashCode()
,Arrays.hashCode()
.if (getClass() != obj.getClass()) ...
Verwendung des Operators instanceof , anstatt ihn zu verwenden. Dies erfordert eine genaue Typübereinstimmung anstelle einer Untertypübereinstimmung. - Symmetrische Anforderung.Da ich vermute,
age
ist vom Typint
:quelle
NullPointerException
Wennname
istnull
.name
nie einnull
Wert zugewiesen wird ...Beim Vergleichen von Objekten in Java führen Sie eine semantische Prüfung durch , indem Sie den Typ und den Identifizierungsstatus der Objekte vergleichen mit:
null
Regeln:
a.equals(b) == b.equals(a)
equals()
immer ergibttrue
oderfalse
, aber nie einNullpointerException
,ClassCastException
oder jede andere throwableVergleich:
instanceof
für den Typvergleich verwenden (was nur funktioniert, solange keine Unterklassen vorhanden sind, und die Symmetrieregel verletzt, wennA extends B -> a instanceof b != b instanceof a)
.Für Ihre
Person
Klasse:Wiederverwendbare generische Dienstprogrammklasse:
Person
Verwenden Sie für Ihre Klasse diese Dienstprogrammklasse:quelle
Wenn age int ist, sollten Sie == verwenden. Wenn es sich um ein Integer-Objekt handelt, können Sie equals () verwenden. Sie müssen auch die Hashcode-Methode implementieren, wenn Sie equals überschreiben. Einzelheiten zum Vertrag finden Sie im Javadoc von Object sowie auf verschiedenen Seiten im Internet.
quelle
Hier ist die Lösung, die ich kürzlich verwendet habe:
quelle