1Z0-826-JPN 対応
ジェネリクス難易度 標準無料

次のコードのコンパイル・実行結果として正しいものを選べ。

1  import java.util.*;
2  public class Q1 {
3      public static void main(String[] args) {
4          List<? extends Number> nums = new ArrayList<Integer>();
5          nums.add(1);             // 行A
6          Number n = nums.get(0);  // 行B
7          System.out.println(n);
8      }
9  }
  1. A行A でコンパイルエラーになる
  2. B1 が出力される
  3. C行B でコンパイルエラーになる
  4. D実行時に ClassCastException がスローされる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:A✓有資格者監修

解説

List<? extends Number> は「Number の何らかのサブ型のリスト」を表すが、 その具体型はコンパイル時に不明。よって要素を追加しようとすると、引数がどの型に当てはまるか保証できず、 add は null 以外を受け付けない(上限付きワイルドカードは プロデューサ=読み取り専用。PECS の "Producer Extends")。 行A の nums.add(1) は型推論で受理されずコンパイルエラー。行B の get は要素を Number として安全に取り出せるため問題ない。
各誤答が違う理由
  • B行A でコンパイルが通らないため、そもそも実行されず出力に至らない。
  • C行B の get は ? extends Number から Number として取り出すので完全に合法。エラーにならない。
  • Dコンパイルが通らない以上、実行時例外(ClassCastException)は発生し得ない。
ひっかけ: 「add は List のメソッドだから当然呼べる」と思い込む。? extends は読めるが書けない(null除く)。
実機確認の答え合わせ
javac でコンパイルすると行Aで
「incompatible types: int cannot be converted to CAP#1 / no suitable method found for add(int)」系のエラー。
→ コンパイル不成立(実行に至らない)。
✓有資格者(著者)による書き下ろし解説

有資格者(著者)が監修した問題は、すべて無料サンプルとして公開しています。買う前に、その全部を実際に解いて解説まで読めます。有料で追加される問題はAIが作成したもので、有資格者の監修は入っていません。

この問題集の作り方

  1. 問題と解説はAIが作成しています。有資格者(著者)が監修した問題は、無料サンプルとして公開している分だけです。有料で追加される問題に監修は入っていません。
  2. 各問に、公式ドキュメントの出典リンクを付けています。書いてあることは、出典に当たって確かめられます。
  3. 誤答の選択肢それぞれに、なぜ誤りなのかの理由を書いています。
  4. 解説に載せているコンパイル結果は、実際に javac を走らせた出力です。想定した挙動ではありません。
  5. 誤りを見つけたら報告できます。原則として無償で訂正・削除します。
  6. 各試験の運営団体とは無関係の非公式教材です。合格を保証するものではありません。
この分野をもっと解いて、得点源に
ジェネリクス を含む問題を分野別に演習できます。
演習する →