因为a discussion about one answer here on Stack,我问这个问题。声明如下:
给出以下代码:
List<?> list =new ArrayList<Integer>();
为什么我们不能这样做:
Integer e = 2;
list.add(e);
这会抛出编译器错误,尽管我们将列表实例化为ArrayList<Integer>
。
为什么?
答案 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类是它们的父类。