ArrayList描述为
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
大多数主要方法都适用于E泛型类型(get、set,add和addAll等)。
但是方法包含、indexOf和remove将Object类型作为参数-这只是因为内部使用或Object.equals()或其他原因吗?
集合类型仅在必须匹配才能使操作合法的情况下使用其泛型类型E
。如果你有一个字符串列表,那么像add
这样的东西显然只有在传递字符串时才有意义。
但对于像contains
这样的操作,情况就不同了——例如,询问字符串列表是否包含特定的Integer
是完全合法的。答案永远是否定的,但这并不意味着提出这个问题是错误的。
从用于ArrayList#contains()
的Java 7 API
public boolean contains(Object o)
如果此列表包含指定的元素,则返回
true
。更多形式上,返回true
当且仅当此列表至少包含一个元素CCD_ 9使得CCD_。
由此可见,判断o
是否为列表成员的比较取决于o
对equals()
方法的实现。通过将参数类型指定为Object
,我们可以将确定相等性的责任放在输入对象的类上,而不是列表的类型参数E
上。
这是因为contains、lastIndexOf、remove等方法在执行相应的操作之前需要检查对象的相等性,这是通过使用equals方法完成的。equal方法来自对象类,该类应该被泛型类型E对象覆盖。在此基础上,不需要对get、set、add等方法进行比较。