「また素敵な話題が増えましたね。」

「サプライズが次々とやってくる! 私の誕生日なの?」

「今日は、ジェネリックについて説明します。ジェネリックとは、パラメータを持つ型です。Java では、コンテナ クラスによって、その内部オブジェクトの型を示すことができます。」

「ジェネリック変数を宣言するときは、1 つではなく 2 つのタイプ、つまり変数のタイプとそれに格納されるデータのタイプを指定します。」

「ArrayList はその良い例です。新しい ArrayList オブジェクトを作成するとき、このリスト内に格納される値の型を指定すると便利です。」

コード 説明
ArrayList<String> list = new ArrayList<String>();
という ArrayList 変数を作成しますlist
ArrayList オブジェクトをそれに割り当てます。
このリストにはStringオブジェクトのみを保存できます。
ArrayList list = new ArrayList();
という ArrayList 変数を作成しますlist
ArrayList オブジェクトをそれに割り当てます。このリストには任意の値を保存できます。
ArrayList<Integer> list = new ArrayList<Integer>();
という ArrayList 変数を作成しますlist
ArrayList オブジェクトをそれに割り当てます。
このリストにはIntegerと のint値のみを保存できます。

「非常に興味深いですね。特に、任意の型の値の保存に関する部分です。」

「それは良いことのようにしか思えません。実際には、あるメソッドで ArrayList に文字列を入れ、別のメソッドでそれに数値が含まれることを期待すると、プログラムはクラッシュします (エラーで終了します)。」

"そうか。"

「今のところ、型パラメータを使用した独自のクラスは作成しません。既存のものを使用するだけです。」

「私が作成したクラスであっても、どのクラスでも型パラメータにできますか?」

「はい。プリミティブ型を除く任意の型です。すべての型パラメータは Object クラスから継承する必要があります。」

つまり、 ArrayList<int> を書くことができないということですか?

「確かに、それはできません。しかし、Java 開発者は、プリミティブ型ごとにラッパー クラスを作成しました。これらのクラスはObjectを継承します。次のようになります。」

プリミティブ型 クラス リスト
整数 整数 ArrayList<整数>
ダブル ダブル ArrayList <Double> _
ブール値 ブール値 ArrayList< Boolean >
文字 キャラクター ArrayList<文字>
バイト バイト ArrayList<バイト>

「プリミティブ クラスとその類似物 (ラッパー クラス) を相互に簡単に割り当てることができます。」

int a = 5;
Integer b = a;
int c = b;

Character c = 'c';  //the literal c is a char
char d = c;
Byte b = (byte) 77;  // The literal 77 is an int
Boolean isOk = true;  // the literal true is a boolean
Double d = 1.0d;  // The literal 1.0d is a double

「素晴らしいですね。ArrayList をもっと頻繁に使ってみようと思います。」