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
| 归档时间: |
|
| 查看次数: |
16641 次 |
| 最近记录: |