Top / Java / Tiger / Generics

Genericsって

Genericsとは、C++のテンプレートのような機能で、クラスやインタフェースをパラメータ化するための技術だそうです。Genericsを使うことによって、

などいろいろな効果があるようです。

たとえば

List list = new ArrayList();
list.add(new Integer(10));
String str = (String) list.get(0);

などのエラーは実行時しか検知できませんか、Genericsを使って記述すると

List<Integer> list = new ArrayList<Integer>();
list.add(new Integer(10));
String str = (String) list.get(0); <-コンパイルエラーとなる

となりコンパイルエラーとなります。コンパイル時にエラーとなるので、保守性が向上するわけですね。

さて構文ですが、

List<Integer> list = new ArrayList<Integer>();

などとクラス名<クラス名>という構文になります。http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/List.html を見てもわかるとおりJavaDoc?

インタフェース List<E>

と宣言されています。

Iteratorと使う

先はListの例でしたが、次はIteratorです。Listの返り値はパラメタ化Iteratorなので e.next() したときにIntegerにキャストがいらなくなります。

public class GenericsSample {
  public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>();//IntegerでListを作成
    for (int i = 0; i < 10; i++) {
      list.add(new Integer(i));
    }

    Iterator<Integer> e = list.iterator();//このIteratorはIntegerのIterator
    while (e.hasNext()) {
      Integer integer = e.next(); //Integerにキャストがいらない
      System.out.println(integer);
    }

  }
}

Mapと使う

次はMapです。key,valueがあるので

Map<String, Integer> map = new HashMap<String, Integer>();

という指定になります。

public static void main(String[] args) {
  Map<String, Integer> map = new HashMap<String, Integer>();
  for (int i = 0; i < 10; i++) {
    map.put("key_" + Integer.toString(i), new Integer(i));
  }
  Set<String> keys = map.keySet(); //返り値のSetはStringのSet
  Iterator<String> e = keys.iterator(); //そのSetのIteratorはStringのIterator
  while (e.hasNext()) {
    String key = e.next(); //だからキャストがいらない
    Integer integer = map.get(key); //ここもキャストがいらない。
    System.out.println(key + ":" + integer);
  }
}

この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / Java / Tiger / Generics

現在のアクセス:15797


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS