Menu
Coddy logo textTech

まとめ:ジェネリックコンテナ

CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 58/87。

challenge icon

チャレンジ

簡単

ジェネリクスについて学んだすべてを統合した、多目的なストレージシステムを構築しましょう!任意の型の要素を保存、取得、処理できる Container クラスと、ワイルドカードの実践的な使い方を示すユーティリティメソッドを作成します。

コードは3つのファイルに分けて構成します:

  • Container.java: アイテムのコレクションを管理するジェネリッククラス Container<T> を作成します。コンテナは内部で要素を保存するために ArrayList<T> を使用する必要があります。要素を追加する add(T item)、特定の位置の要素を取得する get(int index)、アイテムの数を返す size()、およびコンテナが空かどうかを確認する isEmpty() メソッドを含めてください。また、内部リストを返す getAll() メソッドも追加してください。
  • ContainerUtils.java: コンテナを操作する静的なジェネリックメソッドを持つユーティリティクラスを作成します:

    printAll(Container<?> container) - 非限定ワイルドカードを使用して、任意のコンテナ内のすべての要素を1行に1つずつ出力します。

    countItems(Container<? extends Number> container) - 上限境界ワイルドカードを使用して、コンテナ内のすべての数値の合計を計算し、結果を double 型で返します。

    addDefaults(Container<? super Integer> container) - 下限境界ワイルドカードを使用して、整数を保持できる任意のコンテナに整数 1、2、3 を追加します。

    <T> T getLastOrDefault(Container<T> container, T defaultValue) - コンテナ内の最後の要素を返すか、コンテナが空の場合はデフォルト値を返すジェネリックメソッドです。

  • Main.java: ジェネリックコンテナシステムを統合します!単語(String)、整数、小数の3つの入力を受け取ります。

    まず、Container<String> を作成し、そこに単語を2回追加します。String container: と出力してから、printAll を使用してその内容を表示します。

    次に、Container<Double> を作成し、そこに小数の値を追加します。空行を出力した後、countItems を使用して Number sum: [sum] と出力します。

    次に、Container<Number> を作成し、それに対して addDefaults を呼び出します。空行を出力した後、After adding defaults: と出力し、printAll を使用して内容を表示します。

    最後に、空の Container<Integer> を作成し、入力された整数をデフォルト値として getLastOrDefault を使用します。空行を出力した後、Last or default: [result] と出力します。

入力は、単語(String)、整数、小数の順に3つ与えられます。

このチャレンジでは、ジェネリッククラス、ジェネリックメソッド、境界付き型パラメータ、および3種類すべてのワイルドカードを組み合わせます。ジェネリッククラスが型安全なストレージを提供し、境界付きワイルドカードが柔軟な読み書きを可能にし、ジェネリックメソッドが異なるコンテナ型にわたって再利用可能な操作を提供するという、それぞれの役割に注目してください!

自分で試してみよう

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 入力を読み込む
        String word = scanner.nextLine();
        int intValue = Integer.parseInt(scanner.nextLine());
        double doubleValue = Double.parseDouble(scanner.nextLine());
        
        // TODO: Container<String> を作成し、word を2回追加する
        // "String container:" と出力し、次に ContainerUtils.printAll() を使用する
        
        // TODO: Container<Double> を作成し、doubleValue を追加する
        // 空行を出力し、次に ContainerUtils.countItems() を使用して "Number sum: [sum]" と出力する
        
        // TODO: Container<Number> を作成し、それに対して ContainerUtils.addDefaults() を呼び出す
        // 空行を出力し、次に "After adding defaults:" と出力して ContainerUtils.printAll() を使用する
        
        // TODO: 空の Container<Integer> を作成する
        // intValue をデフォルト値として ContainerUtils.getLastOrDefault() を使用する
        // 空行を出力し、次に "Last or default: [result]" と出力する
    }
}

オブジェクト指向プログラミングのすべてのレッスン