假设我有一个数组列表,其中包含不同类型的对象…
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
的行为不像我期望的那样。
你是正确的,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和lambdas:
public static <E> boolean containsInstance(List<E> list, Class<? extends E> clazz) {
return list.stream().anyMatch(e -> clazz.isInstance(e));
}
试试这个:
boolean containsObjectOfType(Object o){
for (int i=0;i<shelf.getSize();i++){
if (shelf.get(i).getClass().equals(o.getClass())){
return true;
}
}
return false;
}
方法,如Contains,使用equals方法比较两个对象,您必须重写从Object类继承的equals方法到每个新创建的类。根据您自己类的字段重写它。它应该比较一个对象的所有字段。它还必须检查对象是否为空,并检查参数是否为instancOf。这个链接可以提供更多帮助:https://www.geeksforgeeks.org/overriding-equals-method-in-java/
From Javadoc for ArrayList#contains
如果此列表包含指定的元素则返回true。更正式地说,当且仅当此列表包含至少一个元素e满足(o==null ?)E ==null: 0 .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