1

リスト型パラメーターが拡張されたワイルドカードであるリストに要素を追加しようとしています質問

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

識別は質問のサブクラスです。QUESTION は抽象クラスです。

それは私にこのエラーを与えています

ライン #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ワイルドカード コレクションに何かを追加することは危険です。なぜなら、それが実際にどんな種類のものを含んでいるのかわからないからです。sである可能FreeResponseQuestionもありますが、そうではない可能性もありますClassCastException。ワイルドカード コレクションに何かを追加すると、ほとんどの場合失敗するため、実行時例外をコンパイル時例外に変更して、すべての人の問題を解決することにしました。

を作成する理由は何ArrayList<? extends Question>ですか? 上記の理由で何も追加できないため、ほとんど役に立たないでしょう。ほとんどの場合、ワイルドカードを完全に省略します。

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