Java 逆引き集 | ジェネリクス基礎(型パラメータ) — 型安全なコレクション

Java Java
スポンサーリンク

ジェネリクス基礎(型パラメータ) — 型安全なコレクション

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> で「名前と点数」を管理すると、ジェネリクスの便利さが体感できます。

タイトルとURLをコピーしました