2013-05-22 2 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 версия делает использование API потока и лямбды:

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, если этот список содержит указанный элемент. Более формально возвращает true тогда и только тогда, когда этот список содержит хотя бы один элемент e такой, что (o == null? E == null: o.equals (e)).

Вам необходимо предоставить метод 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; 
} 
Смежные вопросы