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

import java.util.List;

public class NumericSum {

    public static <T extends Number> double sumOfList(List<T> list) {
        double sum = 0.0;
        for (T element : list) {
            sum += element.doubleValue();
        }
        return sum;
    }

    public static void main(String[] args) {
        List<Integer> integerList = List.of(1, 2, 3, 4, 5);
        List<Double> doubleList = List.of(1.1, 2.2, 3.3, 4.4, 5.5);

        double sumOfIntegers = sumOfList(integerList);
        double sumOfDoubles = sumOfList(doubleList);

        System.out.println("Sum of integers: " + sumOfIntegers);
        System.out.println("Sum of doubles: " + sumOfDoubles);
    }
}

この例では、sumOfList メソッドがジェネリクス型パラメータ T を数値型に制約しています。また、Number クラスのメソッド doubleValue() を使用して各要素を double 型に変換しています。これにより、整数型のリストやダブル型のリストなど、様々な数値型のリストに対応できます。

ワイルドカードの上限

ワイルドカードの上限(Upper Bounded Wildcard)は、ジェネリクスにおいて特定の型のサブタイプに制限をかけるために使用されます。ワイルドカードの上限は extends キーワードを使用して指定します。具体的なクラスまたはインターフェースの型の上限を指定することで、その型およびそのサブタイプのみがワイルドカードに適用可能となります。

例えば、以下はワイルドカードの上限を使用したメソッドの例です。

import java.util.List;

public class UpperBoundedWildcard {

    // ワイルドカードの上限を使用したメソッド
    public static double sumOfList(List<? extends Number> list) {
        double sum = 0.0;
        for (Number number : list) {
            sum += number.doubleValue();
        }
        return sum;
    }

    public static void main(String[] args) {
        List<Integer> integerList = List.of(1, 2, 3, 4, 5);
        List<Double> doubleList = List.of(1.1, 2.2, 3.3, 4.4, 5.5);

        // ワイルドカードの上限を使用したメソッド呼び出し
        double sumOfIntegers = sumOfList(integerList);
        double sumOfDoubles = sumOfList(doubleList);

        System.out.println("Sum of integers: " + sumOfIntegers);
        System.out.println("Sum of doubles: " + sumOfDoubles);
    }
}

この例では、List<? extends Number> を使用して、Number クラスを継承するどの型でも引数として受け取ることができる sumOfList メソッドがあります。これにより、IntegerDouble などの Number クラスのサブタイプを含むリストが渡されることができます。

ワイルドカードの上限を利用することで、より柔軟かつ汎用性の高いジェネリクスの使用が可能となります。上限を指定することで、特定の型およびそのサブタイプを受け入れるメソッドやクラスを設計することができ、これによりコードの再利用性が向上します。また、メソッドやクラスが異なる型に対しても動作するようになり、より拡張可能なコードを書くことができます。

ワイルドカードの上限を使用する際には、コードの柔軟性を保ちつつ型安全性を確保することが重要です。特定の型に依存する部分と、より一般的な操作を提供する部分とをうまくバランスさせることで、コードの保守性や可読性を高めることができます。ジェネリクスの上限を理解し、適切に利用することで、より安全で効率的なプログラミングが可能です。

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