jiang2011tao 2015-09-03 01:12 采纳率: 0%
浏览 1637

关于Java泛型反射问题

public static void main(String[] args) {
//告诉编译器我这个集合只能存储String类型的
List col=new ArrayList();

    //告诉编译器我这个集合只能存储Integer类型的
    List<Integer> col2=new ArrayList<Integer>();

    //输出结果为:true
    //这就是常说的去除,编译后jvm虚拟机不会知道这个集合存储什么类型的值
    System.out.println(col.getClass()==col2.getClass());

    //看我如何将String存储到集合col2中。
    /**
     * 在运行过程中,jvm根本不知道col2应该存放什么类型的数据,只是我们在编译器中限定了。
     * 我们通过反射可以获取list的add方法给col2存储其他类型的数据。如这里就可以将“abc”存放到col2中
     * 不明白这里为什么参数一定要是Object.class,不能改为String.class
     */
    try {
        col2.getClass().getMethod("add", Object.class).invoke(col2, "abc");
        System.out.println(col2.get(0));
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

为什么这里必须是Object.class了,list里的add是泛型啊。col2.getClass().getMethod("add", Object.class)

  • 写回答

3条回答 默认 最新

  • Evankaka 博客专家认证 2015-09-03 06:21
    关注

    list里的add是泛型,然后Object.class就确实类型了啊,它是一个基类

    评论

报告相同问题?

悬赏问题

  • ¥15 matlab实现基于主成分变换的图像融合。
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊