请教老师java的泛型在运行时候Erasure掉的问题
来源:8-12 泛型(下)

慕运维6192945
2019-02-22
老师,您好!在"7-12 泛型(下)“的"01:28"处,老师说"为了兼容性,在运行时将所有的泛型内容Erase”,但是在下面的例子中,却可以在运行时候,能够得到泛型的信息,希望老师您解释一下;谢谢老师!
public class Main {
public static void main(String[] args) {
//得到带父类泛型信息的Type对象:
Type type=B.class.getGenericSuperclass();
if(type instanceof ParameterizedType){
ParameterizedType parameterizedType=(ParameterizedType)type;
Type[] types=parameterizedType.getActualTypeArguments();
for(Type ty:types){
Class<?> cl=(Class<?>)ty;
System.out.println(cl.getName());
}
}
}
}
class A<K,V>{
public A(){ }
private K testK;
private V testV;
}
class B extends A<String,Integer>{
public B(){ }
}
上面程序运行的结果是:
java.lang.String
java.lang.Integer
1回答
-
实例的泛型信息会清掉,比如A<String, Integer> a和A<String, String> b,a和b的类型在运行时是相同的,都是A,就是说,从a和b这两个实例来看,看不到他们的类型。同学可以试试a.getClass()和b.getClass()都分别返回什么。
但是同学的例子不一样,我们说B.class.getGenericSuperclass(),从这个类B本身来看,那还是看得到的它是有泛型参数的。
这样设计的原因是:
对于实例来说,要存储其具体的泛型类型,必然要在对象的内存结构上进行修改,加入泛型参数字段。这样就无法进行兼容。
但对于类来说,我们操作的是metadata,每个类只有一份。我们在泛型中引入了getGenericSuperclass这个方法,当然它可以拿到泛型参数,由于是一个新的方法,它不需要考虑兼容性。
012019-03-07
相似问题