2016-07-30 13 views
-3

對不起,它已經很晚了,所以我可能無法解釋所有細節,但我一直在研究這一點,而且我不明白爲什麼數組中的對象Item對象引用沒有使用它給出的Item類的equals方法。我檢查了函數內部兩個Item對象的類類型,並返回類Item。等於未在定義的類的對象上使用的方法

import java.util.Arrays; 

class Item{ 
    private int data; 

    Item(int data){ 
     this.data=data; 
    } 

    public boolean equals(Item item){ 
     return data==item.data; 
    } 
    public String toString(){ 
     return String.format("{data: %d}", data); 
    } 
} 
public class Problem3{ 
    public static void main(String[] args){ 
     Object object=new Object(){ public String toString(){return String.format("{hash code: %d}", hashCode());} }; 
     String date="Friday, July 29"; 
     Item item=new Item(2); 

     Object[] array={"Fri, Jul 29", new Item(2), object, new Integer[]{212, 220, 240, 313, 316, 320, 323, 331}, new Double[]{Math.E, Math.PI, 9.80665}, new Boolean[]{true, true, true, true}, new String[]{"Eckhart", "Eric", "Owen", "Chris", "David", "Mark"}}; 
     System.out.println(Arrays.deepToString(array)); 
     System.out.println(); 

     System.out.println("Searching array for entries . . ."); 
     System.out.printf("\"%s\": %b\n", date, isMember(array, date)); 
     System.out.printf("%s: %b\n", item, isMember(array, item)); 
     System.out.printf("%s: %b\n", object, isMember(array, object)); 
     System.out.print("[\u0065, \u03c0, \u0047]: "+isMember(array, new Double[]{Math.E, Math.PI, 9.80665})); //\ud835 \u0065 
    } 
    private static boolean isMember(Object[] array, Object value){ 
     if(array.length>0){ 
      Object member=array[array.length-1]; 
      if(member instanceof Object[] && value instanceof Object[]){ 
       if(Arrays.deepEquals((Object[])member, (Object[])value)){ 
        return true; 
       } 
      } 
      else if(member.getClass().equals(Item.class) && value.getClass().equals(Item.class)){ 
       if(member.equals(value)){ 
        return true; 
       } 
      } 
      else if(member.equals(value)){ //Object parameter does not have field "data" of Item equals method, so "instance of Item" applied above 
       return true; 
      } 
      Object[] arrayNext=Arrays.copyOf(array, array.length-1); 
      return isMember(arrayNext, value); 
     } 

     return false; 
    } 
} 

回答

1

equals方法的簽名錯誤。它不是覆蓋Object.equals方法。它應該是

public boolean equals(Object item) 
+0

好了肯定,但隨後平等的Object對象參數將無法解析變量Object.data,因爲它不是一個成員或對象。我如何得到一個可以比較Item類字段的equals方法?物品投射? –

+0

是的,有一個演員陣容;在檢查對象是否是正確的類之後。如果不是,則返回false。 – Henry

+0

還有一件事...可以從新的對象()的兩個匿名類是相等的? public boolean equals(Object object){object.getClass()。equals(Item.class)){ \t return data ==((Item)object).data; } return false; } 檢查匿名類參數的instanceof並返回一個相等字段的標誌,類似於我的代碼,我不確定會工作。如果這是可能的,是通過獲取每個對象的字段並做一個深度平等? –

1

簽名equals方法應該是

public boolean equals(Object obj) 
相關問題