java - 为什么能获取到父类的泛型?
阿神
阿神 2017-04-18 09:07:13
[Java讨论组]

我理解java的泛型是假泛型,只在编译期有效,为什么用如下方式能获得父类的泛型。

class Child extends Parent<String>

//Child类中可通过如下代码获取到带<String>的Parent
((ParameterizedType)getClass().getGenericSuperclass().getActualTypeArguments()[0];

class Test<String>如果当前类带了泛型,那么怎么获取?或说获取不到

阿神
阿神

闭关修行中......

全部回复(2)
天蓬老师

java的范型是擦除法,就是只是在编译的时候检测类型是否安全,而在运行时这些范型类型已经被擦除,因此运行时使用反射时无法获知范型的类型,比如:

List<String> list = new ArrayList<>();

java在编译的时候会检测所有加入到list里面的都是String类型,编译后的class文件中是不会有范型的信息,所以运行的时候通过反射API是无法得知list的范型是String的。

而范型子类不一样:

class Child extends Parent<String>

java在编译的时候会检测父类的范型信息,因为子类声明了范型的类型并且在子类的代码中会使用到该类型,所以java会在生成的class中记录该子类声明的范型类型,所以只有在这种情况下运行时通过反射API可以取到该范型的类型。

ringa_lee

你好!一下代码能拿到当前类所带的泛型类型了哦!当然这是你当前类是有定义泛型的前提下才会有,没有定义泛型是会报 数组越界的哦。

getClass().getTypeParameters()[0];
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号