Es wird in Objekt .equals(Object)
javadoc erklärt:Java .equals() instanceof Unterklasse? Warum nicht Superklasse gleich nennen, anstatt sie endgültig zu machen?
Es ist symmetrisch: für jeden Nicht-Null-Referenzwerte x und y, x.equals (y) soll, wenn und nur wahr zurück, wenn y.equals (x) gibt wahr zurück.
Fast überall in Beispiel-Code sehe ich überschriebene .equals(Object)
Methode, die instanceof
als einer der ersten Tests verwendet, zum Beispiel hier: What issues/pitfalls must be considered when overriding equals and hashCode?
public class Person {
private String name;
private int age;
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (!(obj instanceof Person))
return false;
...
}
}
Jetzt mit class SpecialPerson extends Person
in equals
mit:
if (!(obj instanceof SpecialPerson))
return false;
wir garantieren nicht, dass .equals()
symmetrisch ist. Es wurde zum Beispiel diskutiert hier: any-reason-to-prefer-getclass-over-instanceof-when-generating-equals
Person a = new Person(), b = new SpecialPerson();
a.equals(b); //sometimes true, since b instanceof Person
b.equals(a); //always false
Vielleicht ist gleich zu direkten Aufruf Super I sollte am Anfang des SpecialPerson der hinzufügen?
public boolean equals(Object obj) {
if(!obj instanceof SpecialPerson)
return super.equals(obj);
...
/* more equality tests here */
}
Ähnliche Problem wird in effektiven Java diskutiert. Das kannst du lesen. – Mangoose
Zu Manoose Kommentar hinzufügen - Effektive Java Sais: "Der einfachste Weg, um Probleme zu vermeiden, ist nicht zu überschreiben die Gleichheit Methode, in diesem Fall ist jede Instanz gleich nur sich selbst. Dies ist das Richtige zu tun, wenn der Folgende Bedingungen gelten: [...] Eine Oberklasse hat bereits equals überschrieben, und das von vererbte Verhalten der Oberklasse ist für diese Klasse geeignet. " – Fildor
mögliches Duplikat von [Overriding equals und hashCode in Java] (http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java) –