首先泛型<>的参数只能是引用类型,不可以是基本类型呢? 这里就是泛型的擦除机制,java的泛型是伪泛型,在加载过程中,泛型会被擦除,不管你是<String>还是<Integer>都会被擦除为Object类。两个代码如下可以见得
1 public static void main(String[] args) { 2 List<Integer> listOne=new ArrayList<Integer>(); 3 List<String> listTwo= new ArrayList<String>(); 4 listOne.add(2); 5 listTwo.add("zhu"); 6 System.out.println(listOne.getClass()==listTwo.getClass()); 7 }
运行结果为true 一个是String的泛型一个是Integer的泛型,但是他们的Class类,他们的蓝本确是一样的。
1 public static void main(String[] args) { 2 List<Integer> listOne=new ArrayList<Integer>(); 3 List<String> listTwo= new ArrayList<String>(); 4 listOne.add(2); 5 listTwo.add("zhu"); 6 System.out.println(listOne.getClass()==listTwo.getClass()); 7 //通过反射向listOne里面加入string数据 8 try { 9 listOne.getClass().getMethod("add", Object.class).invoke(listOne, "zhuzihan"); 10 for(int i=0;i<listOne.size();i++){ 11 System.out.println(listOne.get(i)); 12 }
接着上面代码写,运用反射也成功的向<Integer>的listOne中加入了String数据,说明他们在加载后其实在java字节码中已经被擦除成一样的Object了
那么泛型既然都被擦除成了Object为什么<String>不利用反射就只能加入String型呢,其实只是java在编译前java会先检查数据再编译,数据不匹配立马报错。
List<Integer> listOne=new ArrayList<Integer>(); List<String> listTwo= new ArrayList<String>(); listOne.add(2); listOne.add(zhu);//报错