プログラミングの用語一覧へ
このページの目次

ジェネリクスとは?

読み方:ジェネリクス

最終更新:2026/08/18

3秒でわかる

扱うを後から差し込めるようにする仕組み。List<String> のように型を渡すことで、キャストを書かずにコンパイル時点で型の誤りを検出できます。

もう少し詳しく

どういうものか

ジェネリクスは、クラスメソッドが扱う型を「型パラメータ」として外から与えられるようにする仕組みです。class Box と書けば、BoxBox を同じ実装から作れます。同じロジックを型ごとに複製する必要がなくなり、しかも型が混ざればコンパイルエラーになります。

なぜ必要か

ジェネリクス導入前の Java では、コレクションは何でも Object として受け取っていました。取り出すたびにキャストが必要で、String を入れたつもりの箱に Integer が紛れていても、実行するまで気付けません。落ちるのは本番のリクエスト処理の途中です。型パラメータを付ければ、代入の時点で誤りが分かります。

具体例

List<String> names = new ArrayList<>(); names.add("sato"); // names.add(1); ここでコンパイルエラーになる String first = names.get(0); // キャスト不要 static <T extends Comparable<T>> T max(List<T> list) { T best = list.get(0); for (T v : list) { if (v.compareTo(best) > 0) best = v; } return best; }

extends Comparable のように上限を付けると、比較できる型だけを受け付けられます。

つまずきやすいところ

  • 実行時には型情報が消える(型消去)ため、new T[10]if (list instanceof List) は書けない

  • 基本型は入れられない。List は不可で List になる

  • ListList は代入できない。継承関係は型引数へ引き継がれないため、必要なら List のようにワイルドカードを使う
  • 型引数を省いた List を使うと警告が出て、ジェネリクスの恩恵が消える
  • 似た用語との違い

    メソッドだけをジェネリックにすることもできます。クラス全体に型パラメータを付けると利用側が常に型を書く必要がありますが、static void print(List list) のようにメソッド単位で付ければ、その呼び出しの間だけ型が決まります。ユーティリティ的な処理を書くときはメソッド単位から始めると過剰にならずに済みます。

    C++ のテンプレートは型ごとに実体を生成しますが、Java のジェネリクスはコンパイル時のチェックのみで実行時には消えます。TypeScript の総称型も同様に実行時には残りません。

    覚え方

    <> は「あとで中身を決める空欄」です。空欄を埋めた瞬間から、その箱は他の型を受け付けなくなります。

    知識のつながり

    サイドバーと同じ推奨ルート・関連語を、まとめて確認できます。

    現在地ジェネリクスプログラミング

    LEARN BY DOING

    この用語を、教材で使ってみる

    直接関連する編と、その編を含むコースです。用語だけで終わらず、ブラウザ上で実際に手を動かせます。

    このコースが入っている学習分野

    この用語を扱うコース

    コース

    Java 中級:コレクション・Stream・例外処理

    64レッスン
    コース

    Java Silver対策

    55レッスン
    コース

    TypeScript入門:型を付けて関数を書く

    22レッスン
    Javaコースの全編を見る