我打开java.util.ArrayList的源码,有一点不明白:为什么ArrayList参数化后elementData[]数组的类型是Object?
public class ArrayList<E> extends ... {
.........
private transient Object[] elementData;
.........
public boolean add(E e) {/*More code*/}
}
问题:为什么不将 elementData 定义为:
private transient E[] elementData
*有什么优点和缺点?
每次你用原始类型创建一个列表,比如:
List<MyObject>
list = new ArrayList<MyObject>
();
构造函数将所有数据转换成一个数组,必须是一个Object[]数组,on:
public ArrayList(Collection<? extends E>
c) { elementData =
c.toArray(); ...
我认为发生这种情况是因为 ArrayList 可以在没有原始类型的情况下进行初始化,例如:
List list = new ArrayList();
list.add(new String("VALUE"));
list.add(new Integer("1"));
for (Object c : list) {
System.out.println(c.toString());
}
而且你可以在里面放不止一种类型的物体。
此外,ArrayList 使用
Arrays.copyOf(elementData, size);
管理一些操作,这将返回一个 Object[]。
你也可以看看here和 here正如保罗所说。