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

Atu*_*tul 2 java

我有一个重新排序java泛型的问题.据我所知,通用信息仅在编译时可用,通过称为"类型擦除"的过程,一旦编译代码并且生成.class文件,所有TYPE信息都会消失.

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

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

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

public void check(List<String> p)
Run Code Online (Sandbox Code Playgroud)

当我从另一个代码调用此方法时,编译器强制执行check方法的参数应该List<String>只是,没有别的.

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

Pio*_*sen 7

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