zoukankan      html  css  js  c++  java
  • java中的伪泛型---泛型擦除(不需要手工强转类型,却可以调用强转类型的方法)

    Java集合如Map、Set、List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int、long、float、double等基础类型的数据。

    使用反射可以破解泛型T类型,如下:

    ArrayList<Integer> array=new ArrayList<Integer>();    
     array.add(1);//这样调用add方法只能存储整形,因为泛型类型的实例为Integer    
     array.getClass().getMethod("add", Object.class).invoke(array, "asd"); //通过反射可以加入字符串类型
    反射的使用:根据类名、方法名以及方法对应的参数,获取方法,并实现方法的调用。
    调用getMethods方法输出的是自身的public方法和父类父接口的public方法。
    调用getDeclaredMethods方法输出的是自身的public、protected、private、default方法。

    泛型擦除概念:

    声明时的泛型擦除处理机制:

    编译成.class文件时,会将.java文件中泛型做一些特殊处理:将类的泛型T去掉,将类中方法中的泛型T(方法参数和返回值T)变成Object,看下边例子,你就秒懂

    //类中方法上的泛型
    public
    T set(int index, T element) { public set(ILjava/lang/Object;)Ljava/lang/Object;
    //类上的泛型
    public
    class FXClass<T> implements List<T> { public class com/example/zs/fanxing/FXClass implements java/util/List {

    引用时的泛型擦除处理机制:

            FXClass<Integer> list1 = new FXClass<Integer>();
            list1.add(new Integer(10));
            list1.add(new Integer(20));
            Integer a =list1.get(0);//这行对应的字节码指令如下:
    INVOKEVIRTUAL com/example/zs/fanxing/FXClass.get (I)Ljava/lang/Object;
    CHECKCAST java/lang/Integer//这句指令的出现是因为源代码中使用了 (Integer a =)

    划重点,个人理解:

     1)get(0)获得的是Object类型,但是编译器看到我们把Object类型赋值给了整形a,所以会生成一条指令CHECKCAST,

    运行时会检查Object能不能转成Integer类型,并且这条指令会抛异常呦。

     2)get(0)并没有手动强转Integer,但编译器却可以调用Integer的方法。

    
    
  • 相关阅读:
    增值业务
    话题:jQuery 关于文件上传表单处理的一个非常怪异的问题
    net use 的使用
    c#开发snmp应用
    PowerDesigner15使用时的十五个问题
    一段JS代码,让你的WordPress支持简繁转换(转)
    聚集索引查询优化
    NHibernate 2.1.2相关地址
    Oracle expdp/impdp导出导入命令及数据库备份(转)
    大型ORACLE数据库优化设计方案
  • 原文地址:https://www.cnblogs.com/hongchengshise/p/10556247.html
Copyright © 2011-2022 走看看