陷阱 - 過載而不是覆蓋
請考慮以下示例:
public final class Person {
private final String firstName;
private final String lastName;
public Person(String firstName, String lastName) {
this.firstName = (firstName == null) ? "" : firstName;
this.lastName = (lastName == null) ? "" : lastName;
}
public boolean equals(String other) {
if (!(other instanceof Person)) {
return false;
}
Person p = (Person) other;
return firstName.equals(p.firstName) &&
lastName.equals(p.lastName);
}
public int hashcode() {
return firstName.hashCode() + 31 * lastName.hashCode();
}
}
此程式碼不會按預期執行。問題是 Person 的 equals 和 hashcode 方法不會覆蓋 Object 定義的標準方法。
equals方法簽名錯誤。它應該被宣告為equals(Object)而不是equals(String)。hashcode方法名稱錯誤。它應該是hashCode()(注意大寫字母 C )。
這些錯誤意味著我們已經宣告意外過載,如果在多型上下文中使用 Person,則不會使用這些錯誤。
但是,有一種簡單的方法可以解決這個問題(從 Java 5 開始)。每當你使用 @Override 註解打算你的方法是一個覆蓋:
Version >= Java SE 5
public final class Person {
...
@Override
public boolean equals(String other) {
....
}
@Override
public hashcode() {
....
}
}
當我們將 @Override 註釋新增到方法宣告時,編譯器將檢查該方法是否覆蓋(或實現)在超類或介面中宣告的方法。所以在上面的例子中,編譯器會給我們兩個編譯錯誤,這應該足以提醒我們錯誤。