ジェネリクス基礎(型パラメータ) — 型安全なコレクション
Javaの ジェネリクス(Generics) は「型をパラメータ化」する仕組みです。
コレクション(List, Map, Setなど)を使うときに「どの型を入れるか」を明示でき、型安全(間違った型を入れられない)で、キャスト不要(取り出すときに型変換しなくていい)になります。
基本の書き方
List<String> names = new ArrayList<>();
names.add("Tanaka");
// names.add(123); // コンパイルエラー(型が違う)
String first = names.get(0); // キャスト不要
Java- 型パラメータ
<String>を指定すると、そのリストには文字列しか入れられない。 - 安全性: 間違った型を入れるとコンパイルエラー。
- 便利さ: 取り出すときに
(String)のキャスト不要。
型パラメータの一般形
class Box<T> {
private T value;
public void set(T v) { value = v; }
public T get() { return value; }
}
Java<T>が型パラメータ。- 使うときに型を決める:
Box<Integer> b = new Box<>();
b.set(100);
int x = b.get(); // キャスト不要
Java👉 「型を後から決められるクラス」を作れる。
ワイルドカード(?)
?は「型は何でもいい」という意味。- 例: 引数に「どんな型のリストでも受け取れる」メソッド。
void printList(List<?> list) {
for (Object o : list) {
System.out.println(o);
}
}
Java👉 型を限定しない柔軟な受け取り。
例題で練習
例題1: 型安全なコレクション
List<Integer> scores = new ArrayList<>();
scores.add(80);
scores.add(90);
// scores.add("abc"); // コンパイルエラー
int total = 0;
for (int s : scores) total += s;
System.out.println("合計=" + total);
Java👉 数値だけを扱えるので安全。
例題2: ジェネリッククラスで汎用Box
Box<String> sb = new Box<>();
sb.set("Hello");
System.out.println(sb.get()); // Hello
Box<Double> db = new Box<>();
db.set(3.14);
System.out.println(db.get()); // 3.14
Java👉 同じBoxクラスで型を変えて使える。
例題3: ジェネリックメソッド
class Util {
public static <T> void show(T item) {
System.out.println("Item=" + item);
}
}
Util.show("文字列");
Util.show(123);
Util.show(3.14);
Java👉 メソッド単位で型パラメータを使える。
例題4: ワイルドカードで柔軟に
void printAnyList(List<?> list) {
for (Object o : list) System.out.println(o);
}
printAnyList(List.of("A", "B"));
printAnyList(List.of(1, 2, 3));
Java👉 型を問わず受け取れる。
テンプレート集
ジェネリッククラス
class ClassName<T> {
private T value;
public void set(T v) { value = v; }
public T get() { return value; }
}
Javaジェネリックメソッド
public static <T> void methodName(T arg) {
// argを使った処理
}
Javaコレクション利用
List<Type> list = new ArrayList<>();
list.add(value);
Type v = list.get(0);
Javaワイルドカード
void process(List<?> list) { /* どんな型でも受け取れる */ }
Javaまとめ
- ジェネリクスは「型をパラメータ化」する仕組み。
- 型安全: 間違った型を入れられない。
- キャスト不要: 取り出すときに型変換不要。
- 汎用性: 同じクラスやメソッドを型を変えて再利用できる。
- ワイルドカード: 型を限定しない柔軟な受け取り。
👉 練習課題として「汎用的なPairクラス」を作り、Pair<String, Integer> で「名前と点数」を管理すると、ジェネリクスの便利さが体感できます。
