[英]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方法。 有什么建議么?
覆蓋相等並不像看起來那樣明顯
爪哇
@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.