假设我有一个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
的行为不符合我的预期。
答案 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)
如果此列表包含指定的元素,则返回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