在通配符类型ArrayList中添加元素

时间:2012-08-22 23:29:29

标签: java generics arraylist wildcard bounded-wildcard

我正在尝试在列表中添加一个元素,其中列表类型参数是扩展问题的通配符

    ArrayList<? extends Question> id  = new ArrayList<? extends Question>();
    id.add(new Identification("What is my name?","some",Difficulty.EASY));
    map.put("Personal", id);

识别是问题的子类。问题是一个抽象的类。

它给了我这个错误

在线#1 Cannot instantiate the type ArrayList<? extends Question>

在第2行

The method add(capture#2-of ? extends Question) in the type ArrayList<capture#2-of ? extends Question> is not applicable for the arguments (Identification)

为什么会出现这样的错误?是什么造成的?我该如何解决?

1 个答案:

答案 0 :(得分:2)

想象一下以下场景:

List<MultipleChoiceQuestion> questions = new ArrayList<MultipleChoiceQuestion>();
List<? extends Question> wildcard = questions;
wildcard.add(new FreeResponseQuestion()); // pretend this compiles

MultipleChoiceQuestion q = questions.get(0); // uh oh...

向通配符集合中添加内容很危险,因为您不知道它实际包含哪种Question可以 FreeResponseQuestion s,但它也可能不是,如果它不是,那么你将会在某个地方获得ClassCastException s路。由于向通配符集合中添加内容几乎总是会失败,因此他们决定将运行时异常转换为编译时异常并为每个人节省一些麻烦。

您为什么要创建ArrayList<? extends Question>?它将是无用的,因为由于上述原因你无法添加任何东西。你几乎肯定想完全省略通配符:

List<Question> id = new ArrayList<Question>();
id.add(new Identification(...));