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

import java.util.List;

public class GenericSwapExample {
    
    // ジェネリクスメソッド swapElements
    public static <T> void swapElements(List<T> list, int index1, int index2) {
        if (index1 < 0 || index1 >= list.size() || index2 < 0 || index2 >= list.size()) {
            // インデックスが範囲外の場合は何もせず終了
            return;
        }

        // インデックス1と2の要素を交換
        T temp = list.get(index1);
        list.set(index1, list.get(index2));
        list.set(index2, temp);
    }

    public static void main(String[] args) {
        // 整数型のリスト
        List<Integer> intList = List.of(1, 2, 3, 4, 5);
        // 文字列型のリスト
        List<String> stringList = List.of("apple", "banana", "cherry", "date");
        // 任意の型のリスト
        List<Double> doubleList = List.of(1.1, 2.2, 3.3, 4.4, 5.5);

        // 各リストの要素を表示
        System.out.println("Original Integer List: " + intList);
        System.out.println("Original String List: " + stringList);
        System.out.println("Original Double List: " + doubleList);

        // 各リストで swapElements メソッドを使用して要素を交換
        swapElements(intList, 1, 3);
        swapElements(stringList, 0, 2);
        swapElements(doubleList, 2, 4);

        // 交換後のリストの要素を表示
        System.out.println("After Swapping Integer List: " + intList);
        System.out.println("After Swapping String List: " + stringList);
        System.out.println("After Swapping Double List: " + doubleList);
    }
}

このコードでは、swapElements メソッドを使用して整数型、文字列型、およびダブル型のリストの要素を交換しています。ジェネリクスメソッドを使用することで、異なる型のリストに対して同じメソッドを使用でき、コードの再利用性が向上します。

ジェネリクスメソッド

ジェネリクスメソッドは、ジェネリクスを使用してメソッド内で異なる型のデータを処理できるようにするためのメソッドです。ジェネリクスは、型パラメータを使用して、メソッドやクラスが汎用的に動作するようにします。これにより、型安全性が向上し、コードの再利用性が高まります。

ジェネリクスメソッドの基本構文は以下の通りです:

public <T> returnType methodName(T parameter) {
    // メソッドの本体
}

ここで、<T>は型パラメータであり、メソッド内で使用される型を表します。returnTypeはメソッドが返す値の型です。T型の引数 parameter を取る例です。

以下に、ジェネリクスメソッドの主な特徴と使用例を示します。

特徴:

  1. 型安全性の向上: ジェネリクスを使用することで、コンパイル時に型の一貫性が確認され、実行時エラーを減少させます。
  2. コードの再利用性: 同じメソッドが異なる型で使えるため、コードの再利用が容易になります。

使用例:

public class GenericMethodExample {

    // ジェネリクスメソッド
    public static <T> T getFirstElement(T[] array) {
        if (array == null || array.length == 0) {
            return null;
        }
        return array[0];
    }

    public static void main(String[] args) {
        // Integer型の配列
        Integer[] intArray = {1, 2, 3, 4, 5};
        // String型の配列
        String[] stringArray = {"apple", "banana", "cherry"};

        // ジェネリクスメソッドを使用して配列の最初の要素を取得
        Integer firstInt = getFirstElement(intArray);
        String firstString = getFirstElement(stringArray);

        // 結果の表示
        System.out.println("First Integer: " + firstInt);
        System.out.println("First String: " + firstString);
    }
}

この例では、getFirstElement メソッドがジェネリクスメソッドとして実装されています。異なる型の配列を受け取り、最初の要素を取得することができます。これにより、同じメソッドが異なる型に対して使用でき、型安全性が確保されます。

ジェネリクスメソッドは、柔軟性と型安全性を提供し、異なる型に対して同じロジックを適用できる重要な概念です。これにより、コードの再利用性が向上し、プログラムの保守性が向上します。ジェネリクスメソッドは、コレクションやアルゴリズムの実装など、さまざまな場面で活用されます。

型安全性の向上と同時に、冗長なコードの記述を減らすことで、開発者はより効率的にコードを作成できます。ジェネリクスメソッドは、Javaの柔軟な機能の一環として、プログラミング言語の進化において不可欠な要素となっています。

ジェネリクスメソッドを適切に使用することで、型に依存しない柔軟なコードを実現し、バグを未然に防ぎ、保守性の高いプログラミングを実現できます。プログラミングの効率向上とコード品質の向上に寄与するジェネリクスメソッドは、現代のソフトウェア開発において不可欠な技術と言えるでしょう。

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