gpt4 book ai didi

java - Java 数组是同构的,而 ArrayList 不是,这是什么意思?

转载 作者:搜寻专家 更新时间:2023-10-30 21:03:42 25 4
gpt4 key购买 nike

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

最佳答案

数组对添加元素的类型进行运行时检查。也就是说,如果添加了一个不同类型的新元素,一个 ArrayStoreException 在运行时抛出。这就是为什么他们被认为是“本土的”。

这不适用于 ArrayList s(通常为 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); // OK
list.add(new Object()); // OK

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

ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add(1); // compilation error
list.add(new Object()); // compilation error

但即使使用一般声明的列表,您也可以在运行时毫无异常(exception)地进行类似这样的工作:

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));

输出:

a

1

关于java - Java 数组是同构的,而 ArrayList 不是,这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36700490/

25 4 0