簡體   English   中英

如何重寫子類的equals方法

[英]How to override the equals method of a subclass

我試圖在兩個不同位置之間同步用戶,因此我將現有用戶保留在列表中,並因此在設定的時間間隔進行比較,以查看是否應添加(新)或僅更新用戶。

我有一個類User,它是Principal的子類。

但是,我在列表上的比較不起作用; 我在Google上搜索了一下,發現您必須重寫equals方法,但是我確實做到了-但是該代碼似乎沒有執行,它進入ArrayList.class(原始)並在那里執行contains方法。

這是因為我的班級已經擴展了超類Principal嗎? 如果要執行在User類中定義的等式,我有哪些選擇?

public class User extends Principal
{
    // some protected properties
    ...

        @Override
        public boolean equals(Object obj) {
            return (this.getAlias().equals(((User) obj).getAlias())
                && this.getEmailAddress().equals(((User) obj).getEmailAddress()) && this.getCellNumber().equals(((User) obj).getCellNumber()));
    } 
}

Principal類不會覆蓋equals方法,更重要的是,我檢查是否相等的屬性僅包含在子類-User中。 因此,在此處進行檢查很有意義。

簡而言之,我有一個用戶的ArrayList,我想檢查某個用戶是否已經存在。 我在列表上調用了compare,但是它始終失敗,這表明我的代碼中沒有正確覆蓋equals方法。 有什么建議么?

覆蓋相等並不像看起來那樣明顯

  • 等於null必須返回false
  • 與其他類的對象相等等於由於對稱性必須返回false a.equals(b)<=> b.equals(a)

爪哇

@Override
public boolean equals(Object obj) {
    if (obj == this) {
        return true;
    }
    if (obj == null || obj.getClass()!=getClass()) {
        return false;
    }
    return Object.equals(this.getAlias(),((User) obj).getAlias())
        && Object.equals(this.getEmailAddress(),((User) obj).getEmailAddress())
        && Object.equals(this.getCellNumber(),((User) obj).getCellNumber()));
} 

同樣,如果在哈希集合中使用對象,則它必須覆蓋hashCode,以便兩個相等的對象必須返回相同的hashCode,事實並非如此。

您不應該在超類中實現equals() (和hashcode() )。

原因是當equals()返回true時 hashcode() 必須返回相同的

假設您有Point2D類和Point3D類擴展了另一個類。

point2D是否等於面積坐標相同的point3D 如果是這樣,那么point3D必須返回與“等於” point2D相同的哈希 ,這意味着您不能在Hash bases集合中存儲一個以上具有相同區域坐標的poin3d (例如:作為HashMap中的鍵)。

問題可能出在您實例化List<Person> 編譯器無法知道Person重寫的每個子類是否equals 要糾正此問題,您應保證編譯器將覆蓋此方法,可以通過將Person類更改為抽象類來實現。

public abstract class Person {
    @Override
    public abstract boolean equals(Object o);
}

public class User extends Person {
    // Some stuff...
    @Override
    public boolean equals(Object o) {
        if (o == null || ! (o instanceof User))
            return false;
        // etc
    }
}

根據有效Java一書中的內容。如果您覆蓋了equals方法,則必須覆蓋哈希碼方法。 覆蓋equals方法時的一些建議:1.等於null的返回false。 2.!(obj instanceof this)返回false。 3.將obj轉換為此類,並比較obj和此類中的參數。 最后返回結果

您應該使用arrayList的contains方法

https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM