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

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

1  import java.util.*;
2  public class Q2 {
3      public static void print(List<String>  list) { System.out.println("String"); }
4      public static void print(List<Integer> list) { System.out.println("Integer"); }
5      public static void main(String[] args) {
6          print(new ArrayList<String>());
7          print(new ArrayList<Integer>());
8      }
9  }
  1. AString 改行 Integer の順で出力される
  2. Bコンパイルエラー(2つの print が型消去後に同一シグネチャになる)
  3. C実行時に例外がスローされる
  4. DInteger のみ出力される
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:B✓有資格者監修

解説

ジェネリクスは型消去(type erasure)されるため、print(List<String>) と print(List<Integer>) は どちらも実行時には print(List) という同一の消去シグネチャになる。 JLS §8.4.2 により、消去後シグネチャが衝突するオーバーロードは宣言できず、コンパイル時に "name clash" エラーになる。 メソッドのオーバーロードはコンパイル時の静的シグネチャで区別されるが、型パラメータは区別材料にならない。
各誤答が違う理由
  • A2つのメソッドが共存できず宣言段階でコンパイル不成立。実行されない。
  • C実行時の問題ではなくコンパイル時エラー。実行に到達しない。
  • Dオーバーロード自体が成立しないため、どちらか一方が選ばれることもない。
ひっかけ: 引数の総称型が違うのでオーバーロードできそうに見える。実体は型消去で同一=衝突。
実機確認の答え合わせ
javac Q2.java で
「name clash: print(List<Integer>) and print(List<String>) have the same erasure」
→ コンパイル不成立。
✓有資格者(著者)による書き下ろし解説

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

この問題集の作り方

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