1. 程式人生 > >淺談Generics(泛型、引數化型別)

淺談Generics(泛型、引數化型別)

        在Java5中,引入了Generics(泛型、引數化型別)的概念。泛型允許編寫可作用於任意型別的類,但直到宣告類的例項時,才指定特定的型別。因為此型別不是作為類定義的一部分而指定的,所以該類成為一般的、獲得對任意指定的型別起作用的能力。這個概念應該偷師於.Net。
        下面通過集合類的使用展示一下泛型的優點:
        List list = new ArrayList();                                                                  List<integer> list =  new ArrayList<integer>();</integer></integer>
        list.add(Integer.valueOf(1));                                                              list.add(Integer.valueOf(1));

        list.add(Integer.valueOf(2));                                                              list.add(Integer.valueOf(2));
        for(int i=0;i<list.size();i++)                                                                  for(int i=0;i<list.size();i++)              Integer myInteger = (Integer)list.get(i);                                            Integer myInteger = list.get(i);

              System.out.println(myInteger.intValue());                                       System.out.println(myInteger.intValue());
        }                                                                                                               }
        上面紅色部分的程式碼是Java5以前的程式碼,藍色是Java5以後的程式碼,通過對比會發現,在Java5以後,泛型給Java增加了額外的安全性,因此在訪問元素時也不再需要進行強制型別轉換。同時使程式具有可讀性。當然上面的程式如果利用增強的for迴圈、自動裝箱/拆卸機制,程式碼將更優雅。但這是通過編譯器完成的,下面通過程式碼進行證明:
interface Animal{                                                                                         public class Dog implements Animal{
    public void walk();                                                                                      public void walk() {
                                                                                                                             System.out.println("四條腿走路");
                                                                                                                           }
}                                                                                                                      }
public class Test {
    public static <t> void walk(T animal){
        animal.draw();//將發生編譯錯誤,如果修改為:animal.toString();程式碼將正常。
    }
}
        通過上面的程式碼,發現實際引數化型別最終會變成Object型別。這導致了一個問題:Java是強型別語言,而泛型阻礙了強型別化。有點前後不一致的感覺,但這也是為了程式的可移植性。相信伴隨著Java的開源、發展,這些問題將會得到解決。</t>