018 オブジェクト指向の深化(ジェネリクスとワイルドカード) 015 解答例

1. ジェネリクスクラス Box の例:

class Box<T> {
    private T element;

    public Box() {
        this.element = null;
    }

    public void setElement(T element) {
        this.element = element;
    }

    public T getElement() {
        return element;
    }
}

public class Main {
    public static void main(String[] args) {
        // 整数型の Box インスタンス作成
        Box<Integer> intBox = new Box<>();
        intBox.setElement(42);
        System.out.println("整数型の要素: " + intBox.getElement());

        // 文字列型の Box インスタンス作成
        Box<String> strBox = new Box<>();
        strBox.setElement("Hello, Generics!");
        System.out.println("文字列型の要素: " + strBox.getElement());

        // ダブル型の Box インスタンス作成
        Box<Double> doubleBox = new Box<>();
        doubleBox.setElement(3.14);
        System.out.println("ダブル型の要素: " + doubleBox.getElement());
    }
}

この例では、Box クラスを使用して異なる型の要素を格納しています。それぞれの Box インスタンスに対して、setElement メソッドで要素を格納し、getElement メソッドで要素を取得しています。

ジェネリクスの基本

ジェネリクスは、Javaで異なるデータ型に対して同じコードを使い回すための仕組みです。ジェネリクスを使用することで、型安全性が向上し、コードの再利用性が高まります。

ジェネリクスの基本的な概念:

ジェネリクスクラスの定義:

public class Box<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

Box クラスはジェネリクスで、 は型パラメータを表します。このクラスはどんな型の値でも扱えるようになります。

ジェネリクスメソッドの定義:

public <T> T genericMethod(T input) {
    // メソッドの中で T 型の処理を行う
    return input;
}

メソッドがジェネリクスである場合、戻り値の型や引数の型にも型パラメータを使用できます。

型パラメータの実際の型の指定:

Box<Integer> integerBox = new Box<>();
integerBox.setValue(42);
Integer value = integerBox.getValue();

Box クラスを使用する際に、型パラメータに実際の型(ここでは Integer)を指定します。

ジェネリクスの利点:

  • 型安全性: ジェネリクスを使用することで、コンパイル時に型エラーを検出できます。実行時エラーを減少させ、プログラムの安定性を向上させます。
  • コードの再利用性: 同じコードを異なるデータ型で使用できるため、コードの再利用性が高まります。
  • 可読性: ジェネリクスを使用することで、メソッドやクラスの目的がより明確になります。型に関する情報が直接コードに現れるため、可読性が向上します。

例えば、コレクションフレームワーク(List, Set, Map など)はジェネリクスを活用しており、異なる型の要素を格納できる一方で型安全性を保っています。これにより、プログラマはコレクションを使用する際に型キャストなどを行う必要がなくなります。

「018 オブジェクト指向の深化」問題集リスト