• 泛型的擦除机制


     

    首先泛型<>的参数只能是引用类型,不可以是基本类型呢?   这里就是泛型的擦除机制,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);//报错
  • 相关阅读:
    云计算和SOA何时走到了一起?
    MVP
    Mvp
    Technology Radar of thoughtworks
    JSF
    我们要积极学习互联网的用户体验
    Gwt
    数字的字符串处理
    C语言字符串函数大全(转自百度百科)
    树状数组
  • 原文地址:https://www.cnblogs.com/zhuzihan/p/9036598.html
Copyright © 2020-2023  润新知