反射获取泛型中关于泛型声明方式的疑惑

zero dragon 2021-04-11 04:52:46

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


这两种声明变量有什么不同?
为什么反射获取泛型的时候第二种会报错?
Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at cn.zdsch.extend.task_three.TaskThree.main(TaskThree.java:32)

而第一种不会。
...全文
229 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2021-04-12
  • 打赏
  • 举报
回复
泛型是编译器用来做数据类型校验的,是编译器,做类型校验。 第一种,声明的 list 引用,带有泛型。编译器在 list 后续的使用中,就会校验 list 中的元素,是否满足泛型标准,反射也是如此。 第二种,声明的 list 引用,没有泛型。编译器在 list 后续的使用中,无法判断 list 中的元素,是否必须是某个类型,反射当然也取不到泛型相关的内容。 另外,泛型 这种技术,主要是应用在编译器上的,编译完成后的字节码程序中,泛型的东西会被擦除,所以,楼主在使用反射的时候,不是所有的泛型类型都能够得到,要配合 Annotation 注解来辅助完成反射或者动态代理功能。当然,大部分都能得到,这是因为,编译器在编译的时候会进行一定的处理。

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧