重寫Java 的equals() 方法:陷阱和解決方案
在最近的一次遭遇中,開發人員發現了重寫equals() 的一個令人困惑的問題( ) Java 中的方法。當僅使用其 ID 建立 Book 物件並將其傳遞給 equals() 方法時,就會出現問題。
重載與重寫
Java 的 equals() 方法是從 Object 類別繼承為 public boolean equals(Object other);。當方法的簽章(包括參數類型)與超類別方法完全匹配時,就會發生重寫。相反,重載涉及創建具有相同名稱但參數類型不同的方法。
在這種情況下,開發人員最初實作了 equals() 的重載版本,該版本採用 Book 參數而不是 Object 參數。
ArrayList 對重寫 equals() 的依賴
ArrayList,它在開發人員的程式碼,利用重寫的 equals() 方法進行內容比較。儘管重載的 equals() 方法在大多數情況下運作良好,但它遇到了與 ArrayList 的兼容性問題。
問題原因
問題源自於以下事實:重載的 equals() 方法無法匹配重寫的 equals(Object) 方法的簽章。因此,ArrayList 採用了 Object 的預設實現,不執行物件比較。
解決方案:正確重寫equals()
為了解決該問題,開發人員更正了重寫的equals() 方法採用Object 參數,確保與ArrayList :
@Override public boolean equals(Object other) { if (other == null) return false; if (other == this) return true; if (!(other instanceof Book)) return false; Book otherBook = (Book) other; ...test other properties here... }
使用@Override 註解有助於檢測編譯期間不正確的覆蓋。
結論
此經驗凸顯了重要性在擴展類別時遵守 Java 的方法重寫約定。重載可能會導致相容性問題,尤其是在使用 equals() 方法和集合(例如 ArrayList)時。正確的方法重寫可確保一致性並避免不可預測的行為。
以上是為什麼重載 Java 的 `equals()` 方法會破壞 `ArrayList` 功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!