2013-05-22 77 views
9

說我有它填充了不同類型的對象一個ArrayList ...爲什麼ArrayList.contains(Object.class)不能用於查找實例類型?

ArrayList<Fruit> shelf = new ArrayList<Fruit>(); 
Apple apple = new Apple(); 
Orange orange = new Orange(); 
Pear pear = new Pear(); 

shelf.add(apple); 
shelf.add(orange); 
shelf.add(pear); 

我想找出是否shelf包含Orange對象。我試過

shelf.contains(Orange.class) 

但是這不會返回true。我的理解是,contains使用equals方法進行對象比較,所以我不確定爲什麼會出現這種情況。

我意識到我可以簡單地遍歷ArrayList並單獨檢查對象的類型,但我很好奇爲什麼contains不按我期望的方式工作。

回答

17

你是正確的,contains使用equals。然而,一個類的實例不等於該類的一個對象,即Orange.class.equals(new Orange())是錯誤的。

您將需要一個自定義方法來檢查包含類實例的列表。

public static <E> boolean containsInstance(List<E> list, Class<? extends E> clazz) { 
    for (E e : list) { 
     if (clazz.isInstance(e)) { 
      return true; 
     } 
    } 
    return false; 
} 

下面是一個Java 8版本製作使用Stream API和lambda表達式:

public static <E> boolean containsInstance(List<E> list, Class<? extends E> clazz) { 
    return list.stream().anyMatch(e -> clazz.isInstance(e)); 
} 
+0

這是我當前如何實施的檢查,但我認爲使用'contains'可能讓我消除循環。我誤解了類實例和實際對象之間的區別。感謝澄清。 – voidHead

-1

從Javadoc文檔ArrayList#contains

返回true,如果此列表包含指定的元素。更正式地說,當且僅當該列表包含至少一個元素e(例如(o == null?e == null:o.equals(e))時才返回true。

您需要爲contains方法提供一個類的實例,而不是類對象。

ArrayList<Fruit> shelf = new ArrayList<Fruit>(); 
Apple apple = new Apple(); 
Orange orange = new Orange(); 
Pear pear = new Pear(); 

shelf.add(apple); 
shelf.add(orange); 
shelf.add(pear); 

shelf.contains(apple); // returns true 
0

試試這個:

boolean containsObjectOfType(Object o){ 
for (int i=0;i<shelf.getSize();i++){ 
    if (shelf.get(i).getClass().equals(o.getClass())){ 
    return true; 
    } 
} 
return false; 
} 
相關問題