大家來看看這端程序,我最出發(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叫原始類型,原始類型不是類型安全的.這個在編譯時是檢測不出的,運行時才報錯.
而當一個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
所以會報錯,編譯不通過。
所以建議大家多用泛型,這樣可以避免很多麻煩