泛型的擦除机制

 

首先泛型<>的参数只能是引用类型,不可以是基本类型呢?   这里就是泛型的擦除机制,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);//报错

猜你喜欢

转载自www.cnblogs.com/zhuzihan/p/9036598.html
今日推荐