美文网首页
java 泛型擦除小知识

java 泛型擦除小知识

作者: 南土酱 | 来源:发表于2019-04-20 17:18 被阅读0次

本文由个人自行总结,各位大神如有不同建议欢迎指出,也希望能给个关注


代码仅作测试使用,可能不严谨。不可用于开发

class abc <E,T>  {
    private  Map<String, Integer> mapsssss = new HashMap<String, Integer>();
    public <T> void ste(T i) {
        Map<Integer, String> mapaaaaa = new HashMap<Integer, String>();
        System.out.println(mapaaaaa.getClass());
        System.out.println(mapsssss.getClass());
    }
}
Code description:
- 声明了一个泛型类 abc
- 声明了一个泛型的成员变量 mapsssss 和局部变量 mapaaaaa 
- 声明了一个泛型方法 ste()

\color{red}{这里假设您知道了在java中,使用泛型之后, 在编译期间,所有的泛型信息都会被擦除。但是本文想说的是}
并不是完全的擦除
根据javap -v -c 反汇编的信息看出:

image.png image.png

看到上图的 LocalVariableTypeTable 和 Signature .

  • java虚拟机规范中为了响应在泛型类中如何获取传入的参数化类型等问题,引入了signature,LocalVariableTypeTable等新的属性来记录泛型信息,所以所谓的泛型类型擦除,仅仅是对方法的code属性中的字节码进行擦除,而原数据中还是保留了泛型信息的,这些信息被保存在class字节码的常量池中,使用了泛型的代码调用处会生成一个signature签名字段,signature指明了这个常量在常量池的地址,这样我们就找到了参数化类型。这样我们也知道 现在就明白了泛型擦除不是擦除全部

相关文章

网友评论

      本文标题:java 泛型擦除小知识

      本文链接:https://www.haomeiwen.com/subject/kyflgqtx.html