J2SE5.0の新機能(5)Generics | ふぁんくしょん

J2SE5.0の新機能(5)Generics

Generic Types
J2SE5.0の新機能の本命(?)のGenericsです。C++のテンプレートに相当する機能です。C#にも同様の機能が次期バージョンから搭載予定。

Before

ArrayList list = new ArrayList();
list.add(0, new Integer(42));
int total = ((Integer)list.get(0)).intValue();

After

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = list.get(0).intValue();

(sunのページより引用。Autoboxingを使えばnew Integer(42)は単に42と書ける)

従来javaの標準ライブラリのコンテナは要素としてObject型の変数を取っていました。これだと、Integerしか入れないにもかかわらず、コンテナから取り出すときにキャストする必要がありました。これを解消するためにInteger専用のコンテナを作ろうとすると、扱いたい型が増えるたびにいくつも作らなければいけません。

良く考えれば、ArrayListにしろHashtableにしろアルゴリズムはデータの型に依存するものではないので、型を特定しない形でアルゴリズムだけ書いて色々な型で使いまわすのが賢い選択です。それを現状のObject型という形でなく実現するのがGenericsです。

J2SE5.0ではArrayListなど主要コンテナはGenericsを使って書かれているので、上の例のような書き方が可能になっています。上の例はGenericsで書かれたクラスを使う例ですが、Genericsを使ってクラスを設計する場合については別に書くかもしれません。これ以外にGenericなメソッドというのもあります。詳しくは以下を参照してください(英語)。

http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf