我知道,如果我使用泛型方法或泛型类作为原始类型,而我的代码还没有编译,编译器警告我不要将它用作原始类型。
但是,如果我单独编译一个泛型代码,然后在我的新项目中使用已编译的类,编译器如何确切地警告我“给定的类是泛型的,它应该是参数化的”。由于类型擦除,.class文件是纯泛型代码,它一定不知道它是否是泛型的。
为了使我的观点更清楚,如果在我的md.jar中我有一个已经编译的泛型类雇员,并且已经为它生成了一个预泛型类文件(Employee.class)。
现在,我创建了一个新项目,比如DevMon,并在构建路径中包含了md.jar,编译器如何警告我雇员类是泛型的,即使它的类型已经完全删除了。
发布于 2014-02-11 14:24:56
由于类型擦除,.class文件是纯泛型代码,它一定不知道它是否是泛型的。
不,那不是真的。有关泛型类型的信息仍然存在于类文件中。
类型擦除更多的是关于执行时知识。例如,在执行时,通过new ArrayList<Integer>生成的代码创建的对象不知道Integer部件。不过,ArrayList本身知道它是通用的。
例如,此代码显示ArrayList和HashMap的类型参数。
import java.util.*;
import java.lang.reflect.*;
public class Test {
public static void main(String[] args) {
showTypeParameters(ArrayList.class);
showTypeParameters(HashMap.class);
}
private static void showTypeParameters(Class<?> clazz) {
System.out.printf("%s:%n", clazz.getName());
for (TypeVariable typeParameter : clazz.getTypeParameters()) {
System.out.printf(" %s%n", typeParameter.getName());
}
}
}https://stackoverflow.com/questions/21704419
复制相似问题