上回也在javaeye看了一篇文章,讲的是ArrayList泛型,不过不是普通的add,而是通过[color=yellow]反射[/color]来加入对象。
先把代码贴出来
[color=red]注意:红色的不能换掉[/color]
请大家发表下自己的看法。(额,这断代码,是我前几天看地,忘记URL了,抱歉)
arr1通过反射加入字符串的时候没事,但是提取出来,使用方法的时候就报错
arr2不能通过反射来加入整形
先把代码贴出来
public class Test01 {
public static void main(String[] args) throws Exception{
[color=red]ArrayList<Integer>[/color] arr1=new ArrayList<Integer>();
[color=red]ArrayList<String>[/color] arr2=new ArrayList<String>();
//下面打印出来true,证明泛型只是编译器级别的一个东西,加载到内存还是一样的
System.out.println(arr1.getClass()==arr2.getClass());//一样把
//那么可以用跳过编译器用反射直接加入不通类型的东西,测试打印出"dodo"字符串
arr1.add(88);
arr1.getClass().getMethod("add", Object.class).invoke(arr1, "dodo");
System.out.println(arr1.get(1));//打印出来dodo
System.out.println(arr1.get(0) instanceof Integer);//true
System.out.println(arr1.get(1).toString());//报错(可能是在使用方法的时候,强制转换成Integer就报错了)
//既然如此那么下面这个也应该能正确打印,但是报异常异常为: java.lang.ClassCastException
arr2.add("why");
arr2.getClass().getMethod("add", Object.class).invoke(arr2, Integer.valueOf(33));
System.out.println(arr2.get(1));//就报错,可能是arr2.get(1)转换成string报错
}
}
[color=red]注意:红色的不能换掉[/color]
请大家发表下自己的看法。(额,这断代码,是我前几天看地,忘记URL了,抱歉)
arr1通过反射加入字符串的时候没事,但是提取出来,使用方法的时候就报错
arr2不能通过反射来加入整形