java - java编译器如何知道jar中代码的泛型类型信息?

标签 java

我有一个关于重新评级 java 泛型的问题。 据我所知,通用信息仅在编译时可用,通过称为“类型删除”的过程来删除所有类型信息 一旦代码被编译并生成 .class 文件就会消失

一旦 .java 文件被编译,List myList = new arrayList() 就是 .class 文件字节码所具有的内容,即使该列表在 .java 文件中被声明为字符串列表。

话虽如此,请考虑以下场景。

我有一个带有签名方法的 jar

public void check(List<String> p)

当我从另一个代码调用此方法时,编译器强制检查方法的参数应为 List<String>只是,没有别的。

现在,由于 check 方法存在于 jar(.class 文件)中,编译器如何知道 List<String> 所需的 TYPE 信息, 如果 TYPE 信息 制作 .class 文件时已被删除?

最佳答案

类型删除不会删除与泛型相关的所有信息。简而言之,相关方法的签名 ( public void check(List<String> p) ) 被完整保留。 可以在运行时使用反射 API 获取保留的信息(如 getGenericParameterTypes() getTypeParameters() 及其他方法)。

关于java - java编译器如何知道jar中代码的泛型类型信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14083954/

相关文章:

java - web.xml 自定义错误页面不工作

java - 获取 JShell 错误 : ';' expected for basic HelloWorld. java 程序

java - JTextArea 中的控制台输出和用户输入

java NullPointerException 错误。无输出

java - 如何将数值和分类特征传递给 Apache Spark 中的 RandomForestRegressor : MLlib in Java?

java - 根据用户数据获取偏好

java - 是否可以在没有 P12 的情况下向 Android 上的 KeyChain 添加私钥 + 证书?

java - 如何计算进程调度算法的吞吐量

java - 常见 io copyUrlToFile 不起作用

java - 在数据库中查找特定表时,为什么“显示表”比 DatabaseMetaData.getTables() 更好?