java类型擦除与字段#getGenericType和方法#getGenericReturnType
据我所知,泛型是Java的编译时特性,参数化类型信息不存在于编译的字节码中。我现在发现了字段#getGenericType和方法#getGenericReturnType方法,从而打破了我的世界观。请帮我把它拼凑起来。当你在IDE中处理一罐编译过的字节码时,你仍然可以得到通用的自动完成。这就是它的实现方式。基本上你是对的:类型并没有被完全删除。只删除运行时类型的对象。例如:java类型擦除与字段#getGenericType和方法#getGenericReturnType,java,generics,type-erasure,Java,Generics,Type Erasure,据我所知,泛型是Java的编译时特性,参数化类型信息不存在于编译的字节码中。我现在发现了字段#getGenericType和方法#getGenericReturnType方法,从而打破了我的世界观。请帮我把它拼凑起来。当你在IDE中处理一罐编译过的字节码时,你仍然可以得到通用的自动完成。这就是它的实现方式。基本上你是对的:类型并没有被完全删除。只删除运行时类型的对象。例如: Object obj = new ArrayList<String>(); objectobj=newarr
Object obj = new ArrayList<String>();
objectobj=newarraylist();
obj.getClass()
将返回ArrayList.class
。您甚至可以看出,ArrayList
有一个通用参数。但无法判断obj
是否创建为ArrayList
、ArrayList
、ArrayList
、ArrayList
(原始)或其他任何内容
类、方法等的静态类型信息仍然存在(尽管不适用于局部变量)。这只是附加在类文件中作为属性的额外数据位,在运行时可用。可以将其视为具有运行时保留的注释。有问题吗?字段和方法的静态泛型类型信息必须存在于编译的类文件中,以便在编译其他源代码时,编译器可以进行类型检查。例如,当您编写使用类型为
ArrayList
的变量的代码,并对其调用get()
方法时,您没有ArrayList
类的源代码。编译器查看编译后的类文件,获取get()
方法的泛型返回类型,并实现返回泛型类型E
,以便进行类型检查。因此,泛型类型信息必须存在,以便编译器可以检查它