Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java类型擦除与字段#getGenericType和方法#getGenericReturnType_Java_Generics_Type Erasure - Fatal编程技术网

java类型擦除与字段#getGenericType和方法#getGenericReturnType

java类型擦除与字段#getGenericType和方法#getGenericReturnType,java,generics,type-erasure,Java,Generics,Type Erasure,据我所知,泛型是Java的编译时特性,参数化类型信息不存在于编译的字节码中。我现在发现了字段#getGenericType和方法#getGenericReturnType方法,从而打破了我的世界观。请帮我把它拼凑起来。当你在IDE中处理一罐编译过的字节码时,你仍然可以得到通用的自动完成。这就是它的实现方式。基本上你是对的:类型并没有被完全删除。只删除运行时类型的对象。例如: Object obj = new ArrayList<String>(); objectobj=newarr

据我所知,泛型是Java的编译时特性,参数化类型信息不存在于编译的字节码中。我现在发现了字段#getGenericType和方法#getGenericReturnType方法,从而打破了我的世界观。请帮我把它拼凑起来。

当你在IDE中处理一罐编译过的字节码时,你仍然可以得到通用的自动完成。这就是它的实现方式。基本上你是对的:类型并没有被完全删除。

只删除运行时类型的对象。例如:

Object obj = new ArrayList<String>();
objectobj=newarraylist();
obj.getClass()
将返回
ArrayList.class
。您甚至可以看出,
ArrayList
有一个通用参数。但无法判断
obj
是否创建为
ArrayList
ArrayList
ArrayList
ArrayList
(原始)或其他任何内容


类、方法等的静态类型信息仍然存在(尽管不适用于局部变量)。这只是附加在类文件中作为属性的额外数据位,在运行时可用。可以将其视为具有运行时保留的注释。有问题吗?

字段和方法的静态泛型类型信息必须存在于编译的类文件中,以便在编译其他源代码时,编译器可以进行类型检查。例如,当您编写使用类型为
ArrayList
的变量的代码,并对其调用
get()
方法时,您没有
ArrayList
类的源代码。编译器查看编译后的类文件,获取
get()
方法的泛型返回类型,并实现返回泛型类型
E
,以便进行类型检查。因此,泛型类型信息必须存在,以便编译器可以检查它