ArrayList 描述为
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
大多数主要方法都适用于 E 泛型类型(获取,设置,添加, addAll 等)。
但方法包含, indexOf , lastIndexOf 和删除获取对象键入参数 - 这只是因为内部使用或 Object.equals()或其他任何内容?
答案 0 :(得分:3)
集合类型仅在必须匹配的情况下才使用其泛型类型E
,以使操作合法。如果你有一个字符串列表,那么add
之类的东西只有在传递一个字符串时才有意义。
但是对于contains
之类的操作而言,它是不同的 - 例如,询问字符串列表是否包含特定的Integer
是完全合法的。答案永远都是否定的,但问这个问题并不是一个错误。
答案 1 :(得分:2)
来自{7}}的Java 7 API
public boolean contains(Object o)
如果此列表包含指定的元素,则返回
true
。更多 正式地,当且仅当此列表至少包含时,才返回true
一个元素e
,使(o==null ? e==null : o.equals(e))
。
看看这个,它说的是确定o
是否是列表成员的比较取决于o
的{{1}}方法的实现。通过将参数类型指定为equals()
,我们可以负责确定输入对象类的相等性,而不是Object
列表的类型参数。
答案 2 :(得分:1)
那是因为contains,lastIndexOf,remove等方法需要在执行相应的操作之前检查对象是否相等,这是通过使用equals方法完成的。并且方法来自对象类,应该被泛型类型E对象覆盖。 关于这个获取的集合,设置,添加等方法不需要任何比较。