【发布时间】:2017-09-27 10:27:20
【问题描述】:
我使用 javap 反编译了 Map 类。类定义仍然显示泛型类型 K 和 V 的存在。 这应该已经被类型擦除的概念擦除了。为什么这不会发生?
./javap -verbose java.util.Map
Classfile jar:file:/opt/jdk1.8.0_101/jre/lib/rt.jar!/java/util/Map.class
Last modified 22 Jun, 2016; size 4127 bytes
MD5 checksum 238f89b3e2ff9bebe07aa22b0a3493a9
Compiled from "Map.java"
public interface java.util.Map<K extends java.lang.Object, V extends java.lang.Object>
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
Constant pool:
【问题讨论】:
-
您正在查看调试信息。
-
接口定义中还有泛型参数K和V,不应该已经被类型擦除的概念擦除了吗?
-
是和不是。仍然包含一些关于类型参数和泛型超类型的元数据。必须有,否则你不能使用泛型类型,除非你有它们的源代码,因为编译器无法知道它们是泛型的。但元数据是类文件中的“额外”信息。
javap使用此元数据向您展示通用签名而不是原始(已删除)签名。 -
显然它正在工作,否则您将无法编译和执行您的代码。被擦除的类型在你的代码中,例如
Map<? extends Number>,它被擦除为Map。java/util/Map.class中的内容无关紧要。 -
@user207421 为什么会不相关?
Map本身是通用的,所以查看class文件对我来说非常有意义。并使用javap查看该类(或任何其他泛型类)将显示保留类型的泛型信息
标签: java generics type-erasure