Java 泛型是使用类型删除实现的。这意味着如果我有一个方法:
public void setMapParam(Map<String, Integer> p) { ... }
编译后,它将在 .class 中结束为:
public void setMapParam(Map p) { ... }
我有一个包含上述通用类和方法的 JAR 文件。它只是二进制文件。没有源代码什么都没有。
但是当我在代码中使用它时,Eclipse 自动完成会给我 setMapParam(Map<String, Integer> p)
即使在二进制文件中类似于 setMapParam(Map p)
.
即使方法签名已被类型删除(到 Map<String, Integer>
),Eclipse 现在如何类型(Map
)?还是我遗漏了什么?
最佳答案
类型删除不意味着编译后的代码不包含类型参数信息。类和成员定义中使用的类型参数存在于编译代码中并可通过反射获得(参见 TypeVariable
)。
类型删除意味着对象实例 没有单独的类型参数。给定一个类定义 MapImpl extends HashMap<T extends Comparable, Integer>
和该类的实例,您无法找出 T
的具体值是什么在创建实例的代码中使用,因为该信息不存在。但是你可以发现它extends Comparable
并且值类型是 Integer
,因为该信息是类定义的一部分(并由所有实例共享)。
关于java - Eclipse 自动完成 - 当只有二进制 jar 可用时它如何知道泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5058036/