java类型擦除与Field#getGenericType和Method#getGenericReturnType

Lan*_*uhn 10 java generics type-erasure

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

Tom*_*ine 7

正确的运行时类型的对象被擦除.例如:

Object obj = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

obj.getClass()会回来的ArrayList.class.你甚至可以告诉它ArrayList有一个通用参数.但没有办法判断obj是创建为ArrayList<String>,ArrayList<Integer>,ArrayList<Object>,ArrayList(生),或其他任何东西.

静态类型信息仍然存在于类,方法等(尽管不适用于本地人).这只是在类文件中作为属性附加的额外数据,并且在运行时可用.可以想象它与具有运行时保留的注释非常相似.有问题吗?


cle*_*tus 4

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