为什么ArrayList.contains(Object.class)不能用于查找实例类型?

时间:2013-05-22 00:50:03

标签: java arraylist

假设我有一个ArrayList,其中填充了不同类型的对象......

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的行为不符合我的预期。

3 个答案:

答案 0 :(得分:18)

你是对的,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;
}

这是一个使用Stream API和lambdas的Java 8版本:

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

答案 1 :(得分: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;
}

答案 2 :(得分:-2)

来自ArrayList#contains

的Javadoc
  

如果此列表包含指定的元素,则返回true。更正式地说,当且仅当此列表包含至少一个元素e时才返回true(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