| 
                             | 
                         
                        
                            
                                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);
                                     
                                                    }
                                     
                                               }
                                     
                                          }
                                     
                                 | 
                             
                         
                    
                     |