のみほーだい!

のみほーだい!TOP
のみほーだい! は、(株)トラストサービス ITソリューション事業部  が運営する、技術情報交流サイトです。

J2SE 5.0 codeName Tiger

2006/04/04
@author k.mori

Generics ジェネリックス

▼Generics というのは ひとことでいえばクラス (インタフェース)、メソッドのパラメータ化です。
  例をあげると、
■今までは

   ArrayList arraylist = new ArrayList();
     arraylist.add("abc");
     String s = (String)arraylist.get(0); // キャストが必要

■Generics を使うとつぎのようになります

◎ List <String> list = new ArrayList <String > ();
     list.add("abc");
     String str = list.get(0); // キャストが不必要

◎印の <String> というのが Generics の表記です。
これはどういう意味かというと、 <String> で修飾された List オブジェクトは保持する要素
すべて String オブジェクトに なるということを示しています。このためキャストがいらなくなっています。
(Listをnewする際に、Listに追加できる型を最初に設定している)

▼Iteratorを使用した例

  List list = new ArrayList();
    for(int i = 0; i < args.length; i++) {
      list.add(args[i]); // 型チェックが行われない
   }
   StringBuffer buffer = new StringBuffer();
   Iterator it = list.iterator();
     while(it.hasNext()) {
      String tmp = (String)it.next(); // キャストが必要
      buffer.append(it.next());
     }
    System.out.println(buffer);
※Collection#iterator メソッドは戻り値がパラメータ化された Iterator オブジェクトになります。

■Generics

 List <String> list = new ArrayList <String> ();
   for(int i = 0; i < args.length; i++) {
    list.add(args[i]); // 型チェックが行われる
   }
   StringBuffer buffer = new StringBuffer();
   Iterator <String> it = list.iterator();
    while(it.hasNext()) {
      buffer.append(it.next()); // キャストがいらない
     }
   System.out.println(buffer);

▼入れ子パラメータ  2 重リストの例

 public final static String[] cards = {"S", "C", "H", "D"};
  public static void main(String[] args) {
   List deck = new ArrayList();
    for (int i = 0; i < cards.length; i++) {
    List row = new ArrayList();
     for (int j = 1; j <= 13; j++) {
      if (j == 1) {
       row.add(cards[i] + "A"); // 型チェックが行われない
      } else {
      row.add(cards[i] + j); // 型チェックが行われない
      }
    }
    deck.add(row); // 型チェックが行われない
   }
   String card ="";
     for (int i = 0; i < cards.length; i++) {
         for (int j = 0; j < 13; j++) {
       // とっても面倒なキャスト処理
       card = (String)((List)deck.get(i)).get(j);
      System.out.println(card);
      }
     }
    }
※要素を取り出すのに 2 回もキャストする必要があります。

■Generics

  public final static String[] cards = {"S", "C", "H", "D"};
   public static void main(String[] args) {
    List <List<String>> deck = new ArrayList <List < String>> ();
    for (int i = 0; i < cards.length; i++) {
    List <String> row = new ArrayList <String> ();
     for (int j = 1; j <= 13; j++) {
      if (j == 1) {
       row.add(cards[i] + "A"); // 型チェックが行われる
      } else {
       row.add(cards[i] + j); // ここも型チェック
      }
     }
     deck.add(row); // もちろん、ここでも型チェックが行われる
   }
    String card ="";
    for (int i = 0; i < cards.length; i++) {
     for (int j = 0; j < 13; j++) {
        card= deck.get(i).get(j); // 簡単
        System.out.println(card);
     }
    }
   }