淺談Generics(泛型、引數化型別)
阿新 • • 發佈:2019-02-13
在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>
下面通過集合類的使用展示一下泛型的優點:
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 static <t> void walk(T animal){
animal.draw();//將發生編譯錯誤,如果修改為:animal.toString();程式碼將正常。
}
}
通過上面的程式碼,發現實際引數化型別最終會變成Object型別。這導致了一個問題:Java是強型別語言,而泛型阻礙了強型別化。有點前後不一致的感覺,但這也是為了程式的可移植性。相信伴隨著Java的開源、發展,這些問題將會得到解決。</t>