【问题标题】:How does java compiler know of generics type information of a code in jar?java编译器如何知道jar中代码的泛型类型信息?
【发布时间】:2013-06-16 05:29:40
【问题描述】:

我有一个重新升级 java 泛型的问题。 据我所知,通用信息仅在编译时可用,通过一个称为“类型擦除”的过程所有类型信息 编译代码并制作 .class 文件后就消失了

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

话虽如此,请考虑以下情况。

我有一个带有签名方法的罐子

public void check(List<String> p)

当我从另一个代码调用此方法时,编译器强制检查方法的参数应仅为List&lt;String&gt;,仅此而已。

既然检查方法存在于jar(.class文件)中,编译器如何知道List&lt;String&gt;所需的TYPE信息,如果TYPE信息 制作 .class 文件时已被删除?

【问题讨论】:

  • 您的问题不包含一个通用的示例...?

标签: java


【解决方案1】:

类型擦除不会擦除与泛型相关的所有信息。简单地说,有问题的方法的签名(public void check(List&lt;String&gt; p))被完整地保留下来。 保存的信息可以在运行时使用反射 API(如getGenericParameterTypes()getTypeParameters() 和其他方法)获取。

【讨论】:

  • +1 class文件中有通用信息供编译器使用,是JVM不使用(反射除外)
  • @Piotr ,所以就像类型信息在 .class 文件中可用,JVM 不使用它,正如 Peter 所指出的那样。
猜你喜欢
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
相关资源
最近更新 更多