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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 耶稣说wō乖 中级黑马   /  2013-8-20 19:26  /  1554 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

上代码:
package cn.itcast.first;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

public class Generics {
         public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
          ArrayList<String> conn = new ArrayList<String>();
          conn.add("I");
          conn.add("Miss");
          conn.add("You");
          System.out.println("-->"+conn.getClass().getName());
   
          Method m = conn.getClass().getMethod("add",String.class);
          m.invoke(conn,"SoMuch");
  
          System.out.println(conn.get(3));
}
}



报一个叫 java.lang.NoSuchMethodException的异常,把Method m = conn.getClass().getMethod("add",String.class);
改成Method m = conn.getClass().getMethod("add",Object.class);又没事了。
Method里面不是填方法的名和方法的参数类型吗?为什么String不行?
我如果想要得到set(int index,String element)方法,我要怎么写
Method me = conn.getClass().getMethod("set",int.class,Object.class);也是报那个异常。。

评分

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

查看全部评分

5 个回复

倒序浏览
是不是这个原因,泛型仅存在于编译阶段,而反射是在运行阶段,那么invoke时必须调用它的原始定义,就是object
回复 使用道具 举报
楼上正解.
回复 使用道具 举报

ArrayList<String> conn = new ArrayList<String>();
                conn.add("I");
                conn.add("Miss");
                conn.add("You");
                System.out.println("-->" + conn.getClass().getName());

                Method m = conn.getClass().getMethod("add", Object.class);
                m.invoke(conn, "SoMuch");
                System.out.println(conn.get(3));
这样运行正常,
但是API文档中原型是:
[size=-1]boolean
add(E e)
          将指定的元素添加到此列表的尾部。
上面这:ArrayList<String> conn = new ArrayList<String>();不是已经指定了泛型了啊!那写Method m = conn.getClass().getMethod("add", String.class);就不正确??

是不是泛型的默认的都是Object类型的呢?

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 meng 于 2013-8-21 11:49 编辑

写错了,改。查看API,add方法中的元素应该是泛型的东西add(E e)
          将指定的元素添加到此列表的尾部。,不能直接放String类型的,Object是所有泛型的父类,就可以
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马