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

public class GenericExample {

    // 1. ジェネリクスメソッド printElements の宣言
    public static <T> void printElements(List<T> list) {
        // リストの要素を順番に表示
        for (T element : list) {
            System.out.println(element);
        }
    }

    public static void main(String[] args) {
        // 2. printElements メソッドを使用して要素を表示

        // 文字列型のリスト
        List<String> stringList = Arrays.asList("Apple", "Banana", "Orange");
        System.out.println("String List:");
        printElements(stringList);

        // 整数型のリスト
        List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
        System.out.println("\nInteger List:");
        printElements(integerList);

        // 任意の型のリストも表示可能
        List<Double> doubleList = Arrays.asList(1.5, 2.5, 3.5);
        System.out.println("\nDouble List:");
        printElements(doubleList);
    }
}

この例では、printElements メソッドが任意の型のリストを受け取り、その要素を順番に表示する役割を果たしています。<T> はジェネリクスを表し、List<T> は任意の型 T のリストを指定しています。printElements メソッド内で拡張for文を使用して、リストの要素を順番に表示しています。 main メソッドでは、異なる型のリストを作成して printElements メソッドを呼び出しています。

ワイルドカードの非境界

ワイルドカードには、境界がないワイルドカード(unbounded wildcard)があります。これは、<?> と表され、あらゆる型のオブジェクトを受け入れることができます。以下に、ワイルドカードの非境界の使用例と解説を示します。

ワイルドカードの非境界の使用例

import java.util.ArrayList;
import java.util.List;

public class WildcardExample {

    // 1. ワイルドカードの非境界を使用したメソッド
    public static void printElements(List<?> list) {
        for (Object element : list) {
            System.out.println(element);
        }
    }

    public static void main(String[] args) {
        // 2. ワイルドカードの非境界を使用して要素を表示

        // 文字列型のリスト
        List<String> stringList = new ArrayList<>();
        stringList.add("Apple");
        stringList.add("Banana");
        stringList.add("Orange");

        System.out.println("String List:");
        printElements(stringList);

        // 整数型のリスト
        List<Integer> integerList = new ArrayList<>();
        integerList.add(1);
        integerList.add(2);
        integerList.add(3);

        System.out.println("\nInteger List:");
        printElements(integerList);
    }
}

解説

  1. printElements メソッドでは、ワイルドカードの非境界 List<?> を使用しています。これにより、どの型のリストでも受け入れることができます。
  2. main メソッドでは、文字列型のリストと整数型のリストを作成し、それぞれ printElements メソッドに渡しています。ワイルドカードが非境界であるため、異なる型のリストを同じメソッドに渡すことができます。

ワイルドカードの非境界は、Javaにおいて柔軟性と再利用性を提供する重要な概念です。この概念を理解することで、異なる型のコレクションやジェネリクス型を扱う際に、より汎用的で拡張可能なコードを記述することができます。

非境界ワイルドカード (<?>) を使用することで、特定の型に依存しないメソッドやクラスを実装でき、その結果、コードの再利用性が向上します。異なる型を扱う場面で、型に関する柔軟性が求められる際には、非境界ワイルドカードが非常に役立ちます。

ただし、注意が必要であり、非境界ワイルドカードを使用することで型安全性が低下する可能性があるため、コードを慎重に設計することが重要です。状況によっては、境界付きワイルドカードや具象型の使用が適切な場合もあります。

ワイルドカードの理解と適切な使用は、Javaプログラミングにおいて洗練されたコードを書くための一環となります。

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