前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java-通过反射了解集合泛型的本质

Java-通过反射了解集合泛型的本质

作者头像
itze
发布2022-10-31 15:55:41
2050
发布2022-10-31 15:55:41
举报
文章被收录于专栏:IT者
代码语言:javascript
复制
public class ClassDemo3 {
    /**
     * @Author: www.itze.cn
     * @Date: 2020/9/21 13:47
     * @Email: 814565718@qq.com
     */
    public static void main(String[] args) {
        ArrayList list = new ArrayList();

        ArrayList<String> list2 = new ArrayList<>();
        list2.add("hello");  //这里泛型约束类型为String,所有这添加 "hello" 没问题
//        strings.add(100);    这里添加int类型就会报类型错误
        Class<? extends ArrayList> c1 = list.getClass();
        Class<? extends ArrayList> c2 = list2.getClass();
        System.out.println(c1);// class java.util.ArrayList
        System.out.println(c2); //class java.util.ArrayList
        System.out.println(c1 == c2); //true
        /**
         * c1 == c2 执行结果为true 说明泛型编译之后是去泛型化的
         * 泛型的作用可以理解为;Java中泛型的存在是为了防止输入错误,且只在编译阶段有效
         * **************************************************************************
         * 上面的例子 list2中,泛型为String,直接添加strings.add(100); 编译报错
         * 反射都是发生在编译之后的操作,利用反射的这一作用,证明泛型在编译之后时去泛型化的
         * 利用反射绕过编译,实现list2 也能执行add(100)
         */
        try {
            System.out.println("list2添加100之前元素个数:" + list2.size());  // 1
            //使用方法反射 add为list2的方法 Object.class 为参数类型
            Method c2Method = c2.getMethod("add", Object.class);
            c2Method.invoke(list2, 100);
            System.out.println("list2添加100之后元素个数:" + list2.size()); // 2
            /**
             * 这个时候list2就不能用String类型来遍历了
             * 会报java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
             * 要用所有共同父类Object
             */
            //遍历 注意这里是Object不是String
            for (Object str : list2
            ) {
                System.out.println(str);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年9月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档