本文由个人自行总结,各位大神如有不同建议欢迎指出,也希望能给个关注
代码仅作测试使用,可能不严谨。不可用于开发
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()
并不是完全的擦除
根据javap -v -c 反汇编的信息看出:
![](https://img.haomeiwen.com/i15697111/13fd62694d3577e6.png)
![](https://img.haomeiwen.com/i15697111/cdaabe74c6bbb885.png)
看到上图的 LocalVariableTypeTable 和 Signature .
- java虚拟机规范中为了响应在泛型类中如何获取传入的参数化类型等问题,引入了signature,LocalVariableTypeTable等新的属性来记录泛型信息,所以所谓的泛型类型擦除,仅仅是对方法的code属性中的字节码进行擦除,而原数据中还是保留了泛型信息的,这些信息被保存在class字节码的常量池中,使用了泛型的代码调用处会生成一个signature签名字段,signature指明了这个常量在常量池的地址,这样我们就找到了参数化类型。这样我们也知道 现在就明白了泛型擦除不是擦除全部
网友评论