为什么 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的行为不像我期望的那样。

你是正确的,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

最新更新