|
大家來看看這端程序,我最出發(fā)在csdn里
import java.util.ArrayList; import java.util.List;
public class Fangxin { public static void main(String [] args) { List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); new Product().prt(list); } }
class Product { public void prt(List<String> l) { System.out.println(l); } }
=====================================
編譯器:不通過,說無法將Product中的prt(java.util.List<java.lang.String>)應(yīng)用于(java.util.List<java.lang.Integer>)
但改變代碼為這樣后
import java.util.ArrayList; import java.util.List; public class Fangxin { public static void main(String [] args) { List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); System.out.println(); new Product().prt(list); } }
class Product <T> { public void prt(List<String> l) { System.out.println(l); } }
=========================================== 編譯器:使用了未經(jīng)檢查或不安全的操作。 但能編譯通過并運行顯示 [1, 2]
原因是這樣的:(也要感謝kezhu2003(炎陽天)的幫助)
generic class Product<T>在JVM運行時是不存在的,Product叫原始類型,原始類型不是類型安全的.這個在編譯時是檢測不出的,運行時才報錯. 而當(dāng)一個generic class使用原始類型時,其方法里的參數(shù)也就相應(yīng)的使用了原始形態(tài),如此列的java.util.List而不是java.util.List<String> 固new Product().prt(lt)時可以運行.
但product非generic class 則 prt(List<String> l)在jvm編譯時會對l進行類型檢查,
Lsit<String> l 是類型安全的,因為其用了generic collection
所以會報錯,編譯不通過。
所以建議大家多用泛型,這樣可以避免很多麻煩
|