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

时间:2012-12-29 17:04:58

标签: java

我有一个对java泛型进行重新排序的问题。 据我所知,通用信息只能在编译时通过称为“类型擦除”的所有TYPE信息的过程获得 编译代码并生成.class文件后,它就会消失

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

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

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

public void check(List<String> p)

当我从另一个代码调用此方法时,编译器会强制检查方法的参数应仅为List<String>,而不是其他任何内容。

既然检查方法存在于jar(.class文件)中,如果TYPE信息,编译器如何知道List<String>所需的TYPE信息 当.class文件被删除时已经被删除了吗?

1 个答案:

答案 0 :(得分:7)

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