请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

请教老师java的泛型在运行时候Erasure掉的问题

老师,您好!在"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这个方法,当然它可以拿到泛型参数,由于是一个新的方法,它不需要考虑兼容性。


0 回复 有任何疑惑可以回复我~
  • 提问者 慕运维6192945 #1
    十分谢谢老师,辛苦了!
    回复 有任何疑惑可以回复我~ 2019-03-07 22:26:30
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信