2014-09-02 120 views
0

我想比較兩個數組使用Object重寫的方法。我應該把對象參數投到ListInterface,我似乎無法弄清楚發生了什麼。任何幫助,將不勝感激。覆蓋對象等於方法

public class AList<T extends Comparable> implements ListInterface <T> { 

    private T[] list; 
    private int length; 
    private static final int MAX_SIZE = 50; 

    public AList() 
    { 
     this(MAX_SIZE); 
    } 
    public AList(int maxSize) 
    { 
     length = 0; 
     list = (T[]) new AList[maxSize]; 
    } 

    public boolean equals(Object other) 
    { 

     boolean results = true; 
     if (list.length == ((ListInterface<T>) other).getLength()) 
     { 
      for(int i = 0; i < list.length; i++) 
      { 
       if(list[i].equals((ListInterface<T>)other[i])) 
        results = true; 
      } 
     } 
     return results; 
    } 
+1

請提供更多關於什麼是錯的或者你是如何卡住的細節。請注意,我會首先檢查null,然後在檢查其他內容之前檢查引用是否相等。即if(other == null)返回false;'和if(other == this)返回true;'然後我會在* cast之前檢查instanceof *。 – 2014-09-02 02:34:19

+0

AList 的一個實例應該可能等於實現ListInterface 的不同類的實例嗎?這可能會違反.equals(Object o)不變量,如果a.equals(b)爲true,則b.equals(a)也應該爲true。 – Mshnik 2014-09-02 02:34:48

回答

0

如果other一個ListInterface<T>?什麼將

myListInterface.equals(new StringBuilder()); 

做? (答案是拋出一個InvalidCastException什麼的)。鑄造只能改變原始物的類型,例如intboolean它是而不是能夠改變物體的類型。將一個數組轉換爲列表並不會使它成爲一個列表,它只是使得每次嘗試調用該對象所沒有的列表方法時都會引發錯誤。這通常表明你的多態設計不好,但這種方法是個例外。這意味着您首先需要使用instanceof

覆蓋equals很難。嘗試從Eclipse或IntelliJ中自動生成一個以查看進入其中的工作,或者在線查找默認覆蓋實現。

+0

這裏是我的老師的一些建議。 「這個方法應該覆蓋Object類的equals方法,方法頭應該反映這個,你需要將參數從Object轉換爲ListInterface。」第一個數組來自實現ListInterface 的AList類。第二個數組是在主測試中創建的方法。 正在比較的兩個數組如下所示。 T [] list =(T [])new AList [maxSize] AList otherNames = new AList (); – user3242607 2014-09-02 03:20:32

4

看來你的equals方法試圖檢查對象封裝的兩個數組是否包含相同的對象。 Arrays.deepEquals(T [] t1,T [] t2)可能會有所幫助。

public boolean equals(Object other) 
{ 
    if(other == null || ! (other instanceof AList<T>)) 
     return false; 
    AList<T> a = (AList<T>)other; 
    return Arrays.deepEquals(list, a.list); 
}