【新人エンジニア向け】ジェネリクスとは?

新人エンジニア向けに、Javaのジェネリクス(Generics)の基本構文と制約について、わかりやすく解説します。


🔷 ジェネリクスとは?

ジェネリクスは、型(クラスやインターフェース)をパラメータとして扱う仕組みです。これにより、型の安全性を保ちつつ、再利用性の高いコードを書くことができます。


✅ 基本構文

1. クラスのジェネリクス

public class Box<T> {
    private T value;

    public void set(T value) { this.value = value; }
    public T get() { return value; }
}
  • Tは型引数(Type Parameter)で、実際に使うときに具体的な型を指定します。
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String s = stringBox.get();

2. メソッドのジェネリクス

public <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}

  • メソッドに型引数を定義する場合は、戻り値の前に <T> を付けます。

📌 型引数の制約(バウンディング)

1. 上限境界(extends)

特定の型かそのサブクラスに制限したいとき:

public class NumberBox<T extends Number> {
    private T number;

    public void setNumber(T number) { this.number = number; }
    public T getNumber() { return number; }
}

使えるのは Integer, Double, Float など Number のサブクラス。

2. 複数境界

public class MultiBound<T extends Number & Comparable<T>> {
    // TはNumberであり、Comparableでなければならない
}

Javaでは、クラスは1つだけ、インターフェースは複数指定可能です。


⚠️ 注意点・制約

1. プリミティブ型は使えない

Box<int> intBox = new Box<>(); // ❌ コンパイルエラー

Integer(ラッパークラス)を使う。

2. 静的コンテキストでは使用不可

public class Sample<T> {
    // static T value; // ❌ 静的な文脈ではTは使えない
}

3. インスタンス生成はできない

T obj = new T(); // ❌ 型引数Tのコンストラクタは不明


🧩 ワイルドカード(?)の基本

1. 任意の型

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

2. 上限付きワイルドカード

List<? extends Number> numbers;

3. 下限付きワイルドカード

List<? super Integer> integers;


✅ まとめ

要素意味
TBox<T>任意の型
T extends ABox<T extends Number>Numberのサブ型に限定
?List<?>任意の型(読み取り専用)
? extends AList<? extends Number>Aのサブ型(読み取り専用)
? super AList<? super Integer>Aの親型(書き込み可能)

💡 実践ポイント

  • 型安全を高めたいとき → 明示的なジェネリクス
  • 柔軟な読み取りだけしたいとき → ? extends
  • 柔軟に書き込みしたいとき → ? super

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。