Java Gold SE11対策:総称型〈ジェネリクス〉の基本と型安全性をマスター!

アイキャッチ画像

Javaでよく登場する List<String> や Map<Integer, String> のような書き方――
これは「総称型(ジェネリクス)」と呼ばれる機能です。

Java Gold SE11の試験でも、コレクションAPIとセットで頻出のテーマ。
型安全なコーディングのために必須となる「ジェネリクス」の基本をわかりやすく解説します。

ジェネリクスとは?

Javaでは、1つのクラスやメソッドでさまざまな型に対応できるように「型のパラメータ化」が可能です。

List<String> names = new ArrayList<>();

List<Integer> numbers = new ArrayList<>();

このように、List の中身を String にしたり Integer にしたりできる仕組みが「ジェネリクス」です。

✅ 読み方:「ジェネリクス」は「総称型」の英語 “Generics” をカタカナで表現したものです。

なぜジェネリクスが必要?

Javaでは、すべてのクラスは Object を継承しているため、ジェネリクスなしでも次のようなコードは書けます:

List list = new ArrayList(); // raw型(非推奨)

list.add(“Hello”);

list.add(123);

しかし、get() で値を取り出すときに問題が発生します。

String str = (String) list.get(0); // OK

String num = (String) list.get(1); // ⚠ ClassCastException!

実行時に例外が起きるリスクが高い!

ジェネリクスで型安全に

ジェネリクスを使うと、コンパイル時に型チェックされ、実行時の例外リスクを減らせます。

List<String> list = new ArrayList<>();

list.add(“Hello”);

// list.add(123); // ❌ コンパイルエラー

String str = list.get(0); // ✅ キャスト不要、型安全!

このように、

  • 不正な型のデータを add できない
  • get 時のキャストが不要

という大きなメリットがあります。

基本の記法:<T>

「型を変数のように扱う」という思想から、<T> のように「型パラメータ」を使います。

public class Box<T> {

    private T value;

    public void set(T value) { this.value = value; }

    public T get() { return value; }

}

使用側では型を指定:

Box<String> b = new Box<>();

b.set(“Hello”);

String s = b.get(); // ✅ キャスト不要

💡 TはTypeの略。E(Element)、K(Key)、V(Value)などもよく使われます。

ジェネリクスには基本型は使えない

List<int> list = new ArrayList<>(); // ❌ エラー

Javaのジェネリクスは「参照型」しか扱えないため、int, double などのプリミティブ型(基本型)は使えません。

代わりに、ラッパークラス(Integer, Double など)を使います。

List<Integer> list = new ArrayList<>();

ジェネリクスを指定しないとどうなる?

型を指定しない書き方(raw型)は、互換性のために残っているが非推奨です。

List raw = new ArrayList(); // ❌ 型チェックされない

raw.add(“文字列”);

raw.add(123);

このように あらゆる型を add できてしまうため、
get() の際にキャストミスで ClassCastException になるリスクがあります。

実務での恩恵まとめ

機能ジェネリクスなし(raw型)ジェネリクスあり
型安全性❌ 低い(キャスト必須、実行時例外)✅ 高い(コンパイル時チェック)
キャストの必要性❌ 必要✅ 不要
可読性・保守性❌ 低い✅ 高い

Java Gold 試験で狙われやすいポイント

  • <T> などの型パラメータの定義場所と意味(クラス/メソッド)
  • 基本型が使えず、ラッパークラスを使う必要がある
  • ジェネリクスを省略すると raw型になり、Object扱いになる
  • List<?> のようなワイルドカードとの違い

まとめ

  • ジェネリクスは型安全性を高める機能
  • <T> などで型をパラメータ化できる
  • 基本型は使えない → ラッパークラスを使う
  • 指定しないと Object 扱いになり、キャストミスの原因に