java - 为什么能获取到父类的泛型?
本文介绍了java - 为什么能获取到父类的泛型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
我理解java的泛型是假泛型,只在编译期有效,为什么用如下方式能获得父类的泛型。
class Child extends Parent<String>
//Child类中可通过如下代码获取到带<String>的Parent
((ParameterizedType)getClass().getGenericSuperclass().getActualTypeArguments()[0];
class Test<String>
如果当前类带了泛型,那么怎么获取?或说获取不到
解决方案
java的范型是擦除法,就是只是在编译的时候检测类型是否安全,而在运行时这些范型类型已经被擦除,因此运行时使用反射时无法获知范型的类型,比如:
List<String> list = new ArrayList<>();
java在编译的时候会检测所有加入到list里面的都是String类型,编译后的class文件中是不会有范型的信息,所以运行的时候通过反射API是无法得知list的范型是String的。
而范型子类不一样:
class Child extends Parent<String>
java在编译的时候会检测父类的范型信息,因为子类声明了范型的类型并且在子类的代码中会使用到该类型,所以java会在生成的class中记录该子类声明的范型类型,所以只有在这种情况下运行时通过反射API可以取到该范型的类型。
这篇关于java - 为什么能获取到父类的泛型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文