1

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

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

其中标识是问题的子类。问题是一个抽象类。

它给了我这个错误

在线#1Cannot 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)

为什么会显示这样的错误?是什么原因造成的?我将如何解决它?

4

1 回答 1

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它实际包含什么类型。它可能FreeResponseQuestions,但也可能不是,如果不是,那么你将ClassCastException在路上的某个地方得到 s。由于向通配符集合中添加内容几乎总是会失败,因此他们决定将运行时异常转为编译时异常,从而为大家省去一些麻烦。

为什么要创建一个ArrayList<? extends Question>? 由于上述原因,您无法向其中添加任何内容,因此它几乎没有用。您几乎可以肯定要完全省略通配符:

List<Question> id = new ArrayList<Question>();
id.add(new Identification(...));
于 2012-08-22T23:42:51.123 回答