gpt4 book ai didi

java - 无法将对象添加到实例化为 ArrayList 的 List
转载 作者:行者123 更新时间:2023-11-30 06:45:00 27 4
gpt4 key购买 nike

我问这个问题是因为 a discussion about one answer here on Stack .声明如下:

给定以下代码:

List<?> list =new ArrayList<Integer>();

为什么我们不能:

Integer e = 2;
list.add(e);

这会引发编译器错误,尽管我们将列表实例化为 ArrayList<Integer>。 .

这是为什么?

最佳答案

因为 List<?>可以是任何类型的列表(例如 List<String>)。并且编译器不应允许将错误的类型添加到列表中。

但是,如果您知道实际的类,那么您可以在运行时进行类转换:

((List<Integer>)list).add(e);

应该避免这样的代码,因为如果在运行时遇到意外类型,它会生成 ClassCastException。更糟糕的是(如 luk2302 所述),我们的 ClassCastException 可能只发生在代码的一个完全不同的区域——即,当我们从列表中检索某些内容时。

更好的方法

如果您知道列表将属于特定类型或该类型的父类(super class),则可以使用有界通配符定义变量:

List<? super Integer> list;
Integer e = 2;

list = new ArrayList<Integer>();
list.add(e);

list = new ArrayList<Number>();
list.add(e);

list = new ArrayList<Object>();
list.add(e);

这种方法,如 M. Prokhorov 所述, 使我们能够避免进行不明智的转换。

关于java - 无法将对象添加到实例化为 ArrayList<Object> 的 List<?>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49779142/

27 4 0