2013-05-22 4 views
9

sagen, dass ich eine Arraylist haben, die mit Objekten unterschiedlicher Typen bevölkert ...Warum funktioniert ArrayList.contains (Object.class) nicht zum Suchen von Instanztypen?

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

Ich möchte herausfinden, ob shelf ein Orange Objekt enthält. Ich habe versucht

shelf.contains(Orange.class) 

, aber das stimmt nicht wahr. Mein Verständnis ist, dass contains nutzt die equals Methode für Objektvergleich, so dass ich nicht sicher bin, warum das der Fall ist.

Ich weiß, ich kann einfach durch die ArrayList iterieren und überprüfen Sie die Art der Objekte einzeln, aber ich bin neugierig, warum contains verhält sich nicht so, wie ich es erwarte.

Antwort

17

Sie sind richtig, contains verwendet equals. Eine Instanz einer Klasse ist jedoch nicht gleich einem Objekt der Klasse, d. H. Orange.class.equals(new Orange()) ist falsch.

Sie benötigen eine benutzerdefinierte Methode, um nach einer Liste zu suchen, die eine Instanz einer Klasse enthält.

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

Und hier ist eine Java-8-Version der Nutzung der Stream-API und Lambda-Ausdrücke:

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

Dies ist, wie ich zur Zeit die Überprüfung implementiert habe, aber Ich dachte, mit 'contains' könnte ich die Schleife eliminieren. Ich habe den Unterschied zwischen einer Klasseninstanz und dem tatsächlichen Objekt falsch verstanden. Danke fürs klarstellen. – voidHead

-1

Von der Javadoc für ArrayList#contains

true zurück, wenn diese Liste enthält das angegebene Element. Formal ausgedrückt, wird true zurückgegeben, wenn und nur wenn diese Liste mindestens ein Element e enthält, so dass (o == null? E == null: o.equals (e)).

Sie müssen die contains-Methode mit einer Instanz der Klasse bereitstellen, nicht mit dem Klassenobjekt.

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

Try this:

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