【新人エンジニア向け】ジェネリクスとは?
新人エンジニア向けに、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;
✅ まとめ
要素 | 例 | 意味 |
---|---|---|
T | Box<T> | 任意の型 |
T extends A | Box<T extends Number> | Numberのサブ型に限定 |
? | List<?> | 任意の型(読み取り専用) |
? extends A | List<? extends Number> | Aのサブ型(読み取り専用) |
? super A | List<? super Integer> | Aの親型(書き込み可能) |
💡 実践ポイント
- 型安全を高めたいとき → 明示的なジェネリクス
- 柔軟な読み取りだけしたいとき →
? extends
- 柔軟に書き込みしたいとき →
? super
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール

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