数组对添加元素的类型进行运行时检查.也就是说,如果添加了不同类型的新元素,则在运行时抛出
ArrayStoreException.这就是他们被认为是“家庭”的原因.
对于ArrayLists(一般列表),情况并非如此.由于运行时类型擦除,它实际上可以容纳任何对象.
运行时以下引发异常:
Object[] array = new String[3];
array[0] = "a";
array[1] = 1; // throws java.lang.ArrayStoreException
不像以下编译和运行没有问题(虽然有编译器警告,因为它没有正确使用泛型):
ArrayList list = new ArrayList();
list.add("a");
list.add(1); // OK
list.add(new Object()); // OK
正确使用泛型,即声明上面的类型ArrayList< String>的变量列表.而不是ArrayList,在编译时避免了这个问题:
ArrayList list = new ArrayList();
list.add("a");
list.add(1); // compilation error
list.add(new Object()); // compilation error
但即使使用一般声明的列表,您也可以在运行时使用此类工作而不会出现异常:
ArrayList list = new ArrayList();
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));
输出:
a
1