本帖最后由 袁梦希 于 2013-4-26 09:59 编辑
楼主你好,
其实这道题,指的是泛型类型只在编译时期有效果,当在运行时期就自动去掉了。
所以我们可以在运行时期利用反射插入一个Integer类型的值。
我给你写了段代码和详细的注释,你看看能不能帮到你。- package com.xbox.test;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- /*
- * 第二题:ArrayList<Integer> list = new ArrayList<Integer>();
- * 在这个泛型为Integer的ArrayList中存放一个String类型的对象。
- */
- public class Test {
- //这里我们为了代码好看,就把异常抛出了
- public static void main(String[] args) throws Exception {
- ArrayList<String> list = new ArrayList<String>();
- list.add("abc");//这里添加的String类型的数据,没问题,
- // list.add(123); //如果这里添加Integer,编译会报错,所以我们可以用反射,在运行时添加数字
- /*
- *注意如果获取方法的时候如果参数类型为String.class,说明已经限定了String类型
- *所以换成Object类型
- *Method method = list.getClass().getMethod("add",String.class);
- */
- //获取对象的字节码调用其方法,返回其方法对象。
- Method method = list.getClass().getMethod("add",
- Object.class);
- //这里调用的是字符串
- method.invoke(list,"123");//插入Integer对象
- //method.invoke(list,123);//这里貌似不能自动装箱
- System.out.println(list.get(0));
- System.out.println(list.get(1));//打印出了Integer
- }
- }
复制代码 |