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

import java.util.List;

public class NumberPrinter {
    // ジェネリクスメソッド printNumbers を定義
    public static <T extends Number> void printNumbers(List<T> numbers) {
        for (T number : numbers) {
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        // 整数型のリストを作成して表示
        List<Integer> integerList = List.of(1, 2, 3, 4, 5);
        System.out.println("Integer List:");
        printNumbers(integerList);

        // ダブル型のリストを作成して表示
        List<Double> doubleList = List.of(1.1, 2.2, 3.3, 4.4, 5.5);
        System.out.println("\nDouble List:");
        printNumbers(doubleList);

        // 任意の数値型のサブタイプのリストを作成して表示
        List<Float> floatList = List.of(1.0f, 2.5f, 3.7f, 4.2f, 5.8f);
        System.out.println("\nFloat List:");
        printNumbers(floatList);
    }
}

この例では、printNumbers メソッドがジェネリクスメソッドとして実装されています。これを使用して、整数型のリスト、ダブル型のリスト、および浮動小数点数型のリストを表示しています。<T extends Number> のように型制約を追加することで、数値型のサブタイプを受け入れることができます。

ワイルドカードの下限

ワイルドカードの下限 (<? super T>) は、ジェネリクスにおいてメソッドやクラスが特定の型 T またはそのスーパータイプを受け入れる場合に使用されます。ワイルドカードの下限を使うことで、より広い範囲の型を受け入れることができます。

例えば、List<? super Integer>Integer または Integer のスーパータイプのリストを表します。この場合、リストには Integer 自体やその親である NumberObject のいずれかが格納されている可能性があります。

以下は、ワイルドカードの下限を使用した例です。これは、整数型の要素を持つリストに新しい整数を追加するメソッドです。

import java.util.List;

public class LowerBoundedWildcardExample {
    public static void addInteger(List<? super Integer> list, Integer value) {
        list.add(value);
    }

    public static void main(String[] args) {
        // Integer型のリスト
        List<Integer> integerList = List.of(1, 2, 3);

        // Number型のリストにIntegerを追加
        List<Number> numberList = List.of(4.0, 5.0, 6.0);

        // Object型のリストにIntegerを追加
        List<Object> objectList = List.of("seven", "eight", "nine");

        // メソッドを使用して要素を追加
        addInteger(integerList, 4);
        addInteger(numberList, 7);
        addInteger(objectList, 10);

        // 結果を表示
        System.out.println("Integer List: " + integerList);
        System.out.println("Number List: " + numberList);
        System.out.println("Object List: " + objectList);
    }
}

この例では、addInteger メソッドが List<? super Integer> を引数として取り、Integer をそのリストに追加します。これにより、integerListnumberListobjectList に対して、異なる上位型のリストに整数を追加することができます。

ワイルドカードの下限 (<? super T>) は、ジェネリクスにおいて柔軟性を提供し、より一般的な型の利用を可能にします。これにより、異なる型の階層構造を持つ要素を操作するメソッドやクラスをより汎用的に作成できます。ワイルドカードの下限を使用する際は、型安全性と柔軟性のバランスを考慮し、適切に利用することが重要です。

上限 (<? extends T>) と同様に、ワイルドカードの下限もジェネリクスの強力な機能であり、メソッドのパラメータやクラスのフィールドにおいて異なる型への対応が求められる場面で有用です。コードの可読性や再利用性を向上させるために、上手に活用することが重要です。

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