• Java泛型:泛型擦除详细介绍、泛型擦除的体现


    泛型擦除

    Java 泛型的参数只可以代表类,不能代表个别对象。由于 Java 泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。Java 编译器在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。-----百度百科


    泛型擦除的体现

    通过以下代码来感受以下什么是泛型擦除:

    public class Erase {
    
        public static void main(String[] args) {
        	// 创建两个不同泛型的list集合
            List<Integer> integerList = new ArrayList<>();
            List<String> stringList = new ArrayList<>();
            
            System.out.println(integerList.getClass() == stringList.getClass());
    
            System.out.println("integerList----> "+integerList.getClass().getName());
            System.out.println("stringList----> "+stringList.getClass().getName());
        }
    }
    

    输出结果

    true
    integerList----> java.util.ArrayList
    stringList----> java.util.ArrayList
    

    很明显发现,两个集合的泛型不同,但是比较class,返回的是true,并且通过反射获取到的className是java.util.ArrayList
    不管是 ArrayList<Integer> 还是 ArrayList<String>,在编译完成后都会被编译器擦除成了 ArrayList。

    Java 泛型擦除是 Java 泛型中的一个重要特性,其目的是避免过多的创建类而造成的运行时的过度消耗。所以,想 ArrayList<Integer> 和 ArrayList<String> 这两个实例,其实类实例是同一个。


    可以把其他类型的数据放到指定了泛型的list集合中吗?

    当然是可以的。因为泛型擦除的原因。完全可以将不相干的类型的数据存入指定泛型的集合中。

    如下所示添加,肯定是要报错的,因为在编译的时候设定了规则,编译是不可能通过的。
    在这里插入图片描述

    按理说,因为泛型擦除的原因,完全是可以将不相干类型的数据放到指定泛型的集合中的。其实,可以换一种思路,当list集合运行起来之后,这个list集合因为泛型擦除是没有指定泛型的,即class是没有泛型的,所以可以在运行期间获取这个list集合,然后将值放到该list集合中。

    public class Erase {
        
        public static void main(String[] args) {
            Erase erase = new Erase();
            erase.testErase();
        }
    
        List<Integer> integerList = new ArrayList<>();
        List<String> stringList = new ArrayList<>();
    
        public void testErase(){
            Double d = 10d;
            try {
            	// 通过反射机制获取字段,然后将double类型的数据放入泛型为Integer集合中
                Field integerField = this.getClass().getDeclaredField("integerList");
                integerField.setAccessible(true);
                List integerFieldList = (List) integerField.get(this);
                integerFieldList.add(d);
    
    			// 通过反射机制获取字段,然后将double类型的数据放入泛型为String集合中
                Field stringField = this.getClass().getDeclaredField("stringList");
                stringField.setAccessible(true);
                List stringFieldList = (List) stringField.get(this);
                stringFieldList.add(d);
            }catch (Exception e){
                e.printStackTrace();
            }
            System.out.println("integerList ---> "+integerList);
            System.out.println("stringList ---> "+stringList);
        }
    }
    

    输出结果

    integerList ---> [10.0]
    stringList ---> [10.0]
    
  • 相关阅读:
    Kali-linux物理访问攻击
    Kali-linux使用NVIDIA计算机统一设备架构(CUDA)
    Kali-linux创建密码字典
    Kali-linux破解操作系统用户密码
    Kali-linux破解纯文本密码工具mimikatz
    Kali-linux绕过Utilman登录
    POJ
    LightOJ
    UVa
    Hdu
  • 原文地址:https://www.cnblogs.com/turbo30/p/13688187.html
Copyright © 2020-2023  润新知