无法将对象添加到List <! - ? - >实例化为ArrayList <object>

时间:2018-04-11 15:34:53

标签: java generics

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

给出以下代码:

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

为什么我们不能这样做:

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

这会抛出编译器错误,尽管我们将列表实例化为ArrayList<Integer>

为什么?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

更好的方法

如果您知道列表是特定类型或该类型的超类,那么您可以使用有界通配符定义变量:

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所述,这种方法使我们能够避免不适当的演员表。

答案 1 :(得分:0)

只需创建一个Arraylist,它们就会让你添加all,因为Integer,String和Boolean是child或者换句话说Object类是它们的父类。