arraylist内部使用Object [] Array,它是同构的,然后arraylist是异构的
以下内容在运行时抛出异常:
Object[] array = new String[3];
array[0] = "a";
array[1] = 1; // throws java.lang.ArrayStoreException
不同于以下编译和运行没有问题的
ArrayList list = new ArrayList<String>();
list.add("a");
list.add(1); // works
list.add(new Object()); // works
答案 0 :(得分:4)
ArrayList
的后备数组是Object[]
(即该数组的元素类型是Object
类,而不是Object
的任何子类,所以你可以把任何引用类型(以及基元,它们自动装箱到它们相应的包装类型)。
以下内容不会引发异常:
Object[] array = new Object[3];
array[0] = "a";
array[1] = 1;
您可以在ArrayList
构造函数中看到支持数组的初始化:
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity]; // here
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
答案 1 :(得分:0)
泛型是Java语言的编译时功能。在运行时,所有定义的泛型类型都被认为是VARCHAR(20)
类型。因此,使用Object
作为支持列表非常有意义。
将这两个编译成相同的东西(相同的字节码):
Object[]
另一方面,数组类型在编译和运行时是一致的。这些将在编译后生成不同的字节码:
ArrayList<String> list = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
答案 2 :(得分:0)
因为它持有Object,它是所有类的父类,所以最终我们将异构化为异构。这不是定义arraylist的理想方式。但从技术上讲,我们可以做到。