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

java编译器如何知道jar中代码的泛型类型信息?,java,Java,我有一个问题需要对java泛型进行重新分级。 正如我所知,泛型信息只有在编译时才可用,通过一个称为“类型擦除”的过程来删除所有类型信息 一旦编译代码并生成.class文件,就会消失 也就是说,一旦编译了.java文件,List myList=new arrayList(),就是.class文件字节码的内容,即使该列表在.java文件中声明为字符串列表 已经说过,考虑下面的场景。 我有一个带有签名的方法的jar public void check(List<String> p) 公共

我有一个问题需要对java泛型进行重新分级。 正如我所知,泛型信息只有在编译时才可用,通过一个称为“类型擦除”的过程来删除所有类型信息 一旦编译代码并生成.class文件,就会消失

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

已经说过,考虑下面的场景。

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

public void check(List<String> p)
公共作废检查(列表p)
当我从另一个代码调用此方法时,编译器强制check方法的参数应该是
List
only,而不是别的

既然check方法存在于jar(.class文件)中,那么编译器如何知道
列表
所需的类型信息呢
创建.class文件时已删除?

类型擦除不会擦除所有与泛型相关的信息。简单地说,有问题的方法的签名(
公共无效检查(列表p)
)被完整地保留下来。
保留的信息可以在运行时通过反射API(例如,&其他方法)获得。

您的问题没有包含一个泛型的示例…?+1类
文件中有泛型信息供编译器使用,JVM不使用它(反射除外)@Piotr,因此,就好像类型信息在.class文件中可用一样,正如Peter所指出的,JVM不使用它。