ジェネリックスの基本
たとえば、List<String>のように、<…>の形式で型を明示することで、String型専用のリストを生成できます。
List<String> l = new ArrayList<String>(); l.add("Java"); l.add("Scala"); l.add("Ruby"); String str = l.get(0);
同じコードをジェネリックスを利用しないで記述すると、以下のようになります。
List l = new ArrayList(); l.add("Java"); l.add("Scala"); l.add("Ruby"); String str = (String)l.get(0);
リストから取り出した要素はすべてObject型と見なされますので、いちいち型キャストしなければならないのです。ジェネリックスを利用することで、こうした手間や、キャストミスによる例外の発生などを防ぐことができます。
また、リストに要素をセットする際も、想定外の型がセットされることを防げます。
List<String> l = new ArrayList<String>(); l.add(10.1); // String型でないのでコンパイルエラー
ジェネリックスの要素型
ジェネリックスの<…>には、任意の型を指定できます。たとえば「List<List<String>>」とすることで、String型のリストを要素に持つリスト、つまり二次元のリストを表現できます。
また、「Map<String, String>」のように型を複数受け取るクラスもあります。型はカンマ区切りで指定します。