A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 无此姓名 中级黑马   /  2014-4-13 23:58  /  1903 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 无此姓名 于 2014-4-14 02:00 编辑

用反射调用一个类的main方法,main方法的参数为String[],但是为什么invoke中参数需要强转为Object呢


  1. <p>String[] strArr = {"abc","def"};
  2.         Method methodMain = Arguments.class.getMethod("main", String[].class);
  3.         methodMain.invoke(null, new String[] {"123"});//运行时会抛异常java.lang.IllegalArgumentException: argument type mismatch。查看了API文档invoke(Object obj,Object... args),参数是Object,也就是说只要是Object的子类就是可以接收的,所以我往里传new String[] {"123"},按理说应该是可以的。但是运行时抛异常,原因是类型不匹配,很不解。

  4.         methodMain.invoke(null, (Object)new String[] {"123"});        //需要强转为Object才可以
  5. </p>
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

3 个回复

倒序浏览
我不太理解楼主问题,因为我在看这部分的时候只是查了方法的定义:
public Object invoke(Object obj,
                     Object... args)
上写着只接受Object类可变参数,这个可变应该是针对数量的,接收完了也是存在Object类的数组中,所以需要传入的参数转换为Object类,至于为什么这么定义。。是为了最大程度的适应不同的参数类型吧。。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
lwy0319 发表于 2014-4-14 00:54
我不太理解楼主问题,因为我在看这部分的时候只是查了方法的定义:
public Object invoke(Object obj,
     ...

你说的对,定义为Object是为了适应不同的类型,多态嘛。也就是说只要是Object的子类就是可以接收的,所以我往里传new String[] {"123"},按理说应该是可以的。
但是这样做编译能通过,但是会抛异常,说类型不匹配。这是我感到不解的地方
回复 使用道具 举报
多态的前提是要在定义中需要完成转换的,如Object[] strs=new String[] {"123"},你在传入参数之前没有这个步骤吧?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马