zoukankan      html  css  js  c++  java
  • 泛型的擦除机制

     

    首先泛型<>的参数只能是引用类型,不可以是基本类型呢?   这里就是泛型的擦除机制,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);//报错
  • 相关阅读:
    codis安装手册
    引用对象的使用和易产生bug的示例
    shallow copy 和 deep copy 的示例
    [转载] 公知其实就是正常人嘛
    Spring GET请求实体中日期的转换
    [转载] 方方: 借陸遊三個字:錯,錯,錯(3月16日)
    [转载] 英国防疫怪招
    [记录] Disruptor 介绍
    [记录] 重要网址备忘
    [转载] 面对新冠病毒在全球的大流行,我们如何自保?
  • 原文地址:https://www.cnblogs.com/zhuzihan/p/9036598.html
Copyright © 2011-2022 走看看