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 扱いになり、キャストミスの原因に