2013-05-22 10 views
9

Dire che ho un ArrayList che è popolato da oggetti di tipo diverso ...Perché ArrayList.contains (Object.class) non funziona per trovare i tipi di istanze?

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); 

Voglio scoprire se shelf contiene un oggetto Orange. Ho provato

shelf.contains(Orange.class) 

ma questo non restituisce vero. La mia comprensione è che contains utilizza il metodo equals per il confronto degli oggetti, quindi non sono sicuro del motivo per cui questo è il caso.

Mi rendo conto che posso semplicemente scorrere l'ArrayList e controllare il tipo di oggetti singolarmente, ma sono curioso di sapere perché contains non si comporta come mi aspetto.

risposta

17

Lei ha ragione, contains utilizza equals. Tuttavia, un'istanza di una classe non è uguale a un oggetto della classe, ad esempio Orange.class.equals(new Orange()) è false.

Avrete bisogno di un metodo personalizzato per controllare un elenco contenente un'istanza di una classe.

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

Ed ecco una Java 8 versione facendo uso delle API Stream e lambda:

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

Questo è il modo che ho attualmente implementato il controllo, ma Pensavo che usare 'contains' mi avrebbe permesso di eliminare il loop. Ho frainteso la differenza tra un'istanza di classe e l'oggetto reale. Grazie per il chiarimento. – voidHead

-1

Dal Javadoc per ArrayList#contains

restituisce true se questa lista contiene l'elemento specificato. Più formalmente, restituisce true se e solo se questa lista contiene almeno un elemento e tale che (o == null? E == null: o.equals (e)).

È necessario fornire il metodo contains con un'istanza della classe, non l'oggetto di classe.

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

Prova questo:

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