黑马程序员技术交流社区
标题:
再往已定义好的泛型中加入其它类型数据过程中的疑惑
[打印本页]
作者:
柯玲
时间:
2012-7-23 11:12
标题:
再往已定义好的泛型中加入其它类型数据过程中的疑惑
看如下程序:
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
try {
Method addMethod=list.getClass().getMethod("add", Object.class);
//这里要传入String类型,为什么只能是Object.class,而用String.class会报告NoSuchMethodException
addMethod.invoke(list, "nihao");
System.out.println(list.get(0));
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
复制代码
作者:
王贵朝
时间:
2012-7-23 11:14
沙发,我也不懂,求解释!!
作者:
李东升
时间:
2012-7-23 11:53
NoSuchMethodException的意思是,没有这个方法。。
public Method getMethod(String name, Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
Method method = getMethod0(name, parameterTypes);
if (method == null) {
throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
}
return method;
}
复制代码
你调用的这个方法,Method method = getMethod0(name, parameterTypes);是这样获取的,错误在于第二个参数,第二个参数限定了参数类型,Object和String肯定有区别。
我只能这么理解了。。
作者:
柯玲
时间:
2012-7-23 12:25
有木有更好的答案?既然第二个参数的意思是“调用方法包含的参数类型列表”,我的add就要加入String类型的,为什么不能直接写String.class?
作者:
事在亽爲ヽ
时间:
2012-8-28 23:56
不错 很详细了。。
作者:
许庭洲
时间:
2012-8-30 09:14
本帖最后由 许庭洲 于 2012-8-30 09:36 编辑
1. 用ArrayList的麻烦的地方,数据放进去就不知道是什么类型了;
2. 用ArrayList不能防止非法类型数据的放入;
3. 最好用Object.class,因为Object是所有类的父类,而用String.class会报告NoSuchMethodException异常。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2