2014-09-10 73 views
0

因此,在下面的代碼段中,爲什麼我們會在通過getClass()結果的相等性測試後明確地轉換「其他」類。爲什麼要在重寫equals()之前投入一個類進行比較?

public boolean equals(Object other) { 
. 
. 
. 
if (getClass() != other.getClass()) return false; 

Person person = (Person)other; 
. 
. 
. 
} 
+1

因此您可以訪問該類的成員。 – BoltClock 2014-09-10 17:13:54

+0

如果您在沒有明確強制轉換的情況下將'Object'視爲'Person',編譯器將會抱怨。例如,如果您使用'other.firstName',則會失敗,但如果Person類具有該成員,則可以使用'person.firstName'。 – 2014-09-10 17:14:05

回答

0

您現在可以在做比較時做person.getterOnPerson()。回想一下,Object類不包含檢索所需值的所有必要方法。

0

代碼必須能夠訪問Person對象中的任何方法或字段。

public boolean equals(Object other){ 

    if(!(other instanceof Person)){ 
     return false; 
    } 

    Person otherPerson = (Person)other; 

    //now we can check equality 
    return getLastname().equals(otherPerson.getLastname()) 
     && getFirstname().equals(otherPerson.getFirstname()); 
} 

編輯 如果你想以檢查對象不是直接的子類,你也可以使用instanceof如果一個對象實現和接口測試平等。例如,List接口是ArrayListVectorLinkedList的父對象。如果您想測試兩個對象的相等性,其中的任何類型都是這兩個對象的類型,您可以通過檢查這兩個對象是否實現List以及它們的元素是否相同且順序相同。

這是AbstractList的代碼,它就是這麼做的。請注意,我們必須投入列表才能在另一個對象上調用方法listIterator()

public boolean equals(Object o) { 
    if (o == this) 
     return true; 
    if (!(o instanceof List)) 
     return false; 

    ListIterator<E> e1 = listIterator(); 
    ListIterator<?> e2 = ((List<?>) o).listIterator(); 
    while (e1.hasNext() && e2.hasNext()) { 
     E o1 = e1.next(); 
     Object o2 = e2.next(); 
     if (!(o1==null ? o2==null : o1.equals(o2))) 
      return false; 
    } 
    //this check will return false if either iterator 
    //still has elements left which means the lists aren't the same size. 
    return !(e1.hasNext() || e2.hasNext()); 
} 
+0

謝謝先生。這是否意味着我們無法比較來自兩種不同樹的兩個類的對象?我的意思是如果一個類不是另一個的子類... – 2014-09-13 10:19:04

+0

已更新的答案解決您的問題 – dkatzel 2014-09-15 14:35:58

相關問題