3

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

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

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

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

public void check(List<String> p)

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

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

4

1 回答 1

9

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

于 2012-12-29T17:07:43.653 回答