Java数组是同构的是什么意思,但ArrayLists不是?

lfk*_*lfk 13 java arrays collections arraylist data-structures

如果我们有一个Type [],我们只能在其中存储Type或其子类型.ArrayList也是如此.那么为什么说一个是同质的而另一个不是呢?

man*_*uti 19

数组对添加元素的类型进行运行时检查.也就是说,如果添加了不同类型的新元素,则会ArrayStoreException在运行时抛出a.这就是为什么他们被认为是"家庭".

对于ArrayLists(List一般情况下)来说,情况并非如此.由于运行时类型擦除,它实际上可以容纳任何对象.

运行时以下引发异常:

Object[] array = new String[3];
array[0] = "a";
array[1] = 1;   // throws java.lang.ArrayStoreException
Run Code Online (Sandbox Code Playgroud)

不像以下编译和运行没有问题(虽然有一个编译器警告,因为它没有正确使用泛型):

ArrayList list = new ArrayList<String>();
list.add("a");
list.add(1);    // OK
list.add(new Object());  // OK
Run Code Online (Sandbox Code Playgroud)

正确使用泛型,即声明list上面的变量ArrayList<String>而不是类型ArrayList,在编译时避免了问题:

ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add(1);  // compilation error
list.add(new Object());  // compilation error
Run Code Online (Sandbox Code Playgroud)

但即使使用一般声明的列表,您也可以在运行时使用此类工作而不会出现异常:

ArrayList<String> list = new ArrayList<String>();
list.add("a");
Method[] methods = List.class.getMethods();
for(Method m : methods) {
    if(m.getName().equals("add")) {
        m.invoke(list, 1);
        break;
    }
}
System.out.println(list.get(0));
System.out.println((Object) list.get(1));
Run Code Online (Sandbox Code Playgroud)

输出:

一个

1