Đó là tuyên bố trong .equals(Object)
javadoc Object của:Java .equals() instanceof subclass? Tại sao không gọi superclass bằng thay vì làm cho nó cuối cùng?
Nó là đối xứng: đối với bất kỳ tài liệu tham khảo không null giá trị x và y, x.equals (y) sẽ trả về đúng nếu và chỉ nếu y.equals (x) trả về đúng.
Hầu như ở khắp mọi nơi trong ví dụ mã tôi thấy ghi đè .equals(Object)
phương pháp trong đó sử dụng instanceof
là một trong những thử nghiệm đầu tiên, ví dụ ở đây: 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;
...
}
}
Bây giờ với class SpecialPerson extends Person
có trong equals
:
if (!(obj instanceof SpecialPerson))
return false;
chúng tôi không đảm bảo rằng .equals()
là đối xứng. Nó đã được thảo luận ví dụ ở đây: 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
Có lẽ tôi nên thêm vào đầu SpecialPerson của bằng cuộc gọi trực tiếp đến siêu?
public boolean equals(Object obj) {
if(!obj instanceof SpecialPerson)
return super.equals(obj);
...
/* more equality tests here */
}
Vấn đề tương tự cũng được thảo luận trong java hiệu quả. Bạn có thể đọc nó. – Mangoose
Để thêm vào nhận xét của Manoose - Sais Java hiệu quả: "Cách dễ nhất để tránh các vấn đề là không ghi đè phương thức bằng , trong trường hợp đó mỗi cá thể chỉ bằng với chính nó. Đây là điều phải làm nếu có bất kỳ nào của áp dụng các điều kiện sau: [...] Một lớp cha đã ghi đè bằng, và hành vi được kế thừa từ lớp cha là thích hợp cho lớp này. " – Fildor
bản sao có thể có của [Ghi đè bằng và mã băm trong Java] (http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java) –