11

假设我有一个 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它的行为不像我期望的那样。

4

4 回答 4

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));
}
于 2013-05-22T00:55:08.070 回答
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;
}
于 2013-05-22T00:56:49.993 回答
0

像 Contains 这样的方法,使用 equals 方法比较两个对象,您必须将继承自 Object 类的 equals 方法覆盖到每个新创建的类。根据您自己类的字段覆盖它。它应该比较对象的所有字段。它还必须检查对象是否为 null 并检查参数是否为 instancOf 。此链接可以提供更多帮助: https ://www.geeksforgeeks.org/overriding-equals-method-in-java/

于 2022-01-12T16:39:16.360 回答
-2

来自ArrayList#contains的 Javadoc

如果此列表包含指定元素,则返回 true。更正式地说,当且仅当此列表包含至少一个元素 e 满足 (o==null ? e==null : o.equals(e)) 时,才返回 true。

您需要为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
于 2013-05-22T00:54:42.453 回答