数组对添加的元素的类型进行运行时检查。也就是说,如果添加了一个不同类型的新元素,则
ArrayStoreException在运行时将引发。这就是为什么它们被认为是“本地的”。
对于
ArrayLists(
List通常是s)而言,情况并非如此。由于在运行时进行类型擦除,因此它实际上可以容纳任何对象。
运行时,以下内容引发异常:
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); // OKlist.add(new Object()); // OK通过正确使用泛型,即在
listtype之上声明变量
ArrayList<String>而不是
ArrayList,可以在编译时避免该问题:
ArrayList<String> list = new ArrayList<String>();list.add("a");list.add(1); // compilation errorlist.add(new Object()); // compilation error但是,即使有了一个通用声明的列表,您也可以在运行时毫无例外地进行以下工作:
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));输出:
一个
1个



