谢波 发表于 2013-3-26 09:04
上一行反射代码不就是跳过编译器的吗?跟张老师的有什么区别吗? - import java.lang.reflect.InvocationTargetException;
- import java.util.ArrayList;
- import java.util.Collection;
- public class RefectColl {
- public static void main(String[] args) throws Exception {
- /*ArrayList<String> list = new ArrayList<String>();
- list.add("sdfwec");
- list.getClass().getMethod("add", Object.class).invoke(list, 1);*/
- ArrayList<Integer> list = new ArrayList<Integer>();
- list.add(0);
- list.getClass().getMethod("add", Object.class).invoke(list, "ssss");
- System.out.println("list:" + list.get(0));
- System.out.println("list:" + list.get(1));
- System.out.println("list:" + list.get(0).getClass().getName());
- System.out.println("list:" + list.get(1).getClass().getName());
-
- }
- }
复制代码 嗯,你说的没错,是我刚才弄糊涂了。我又测试了一下,如果你这里将String和Integer换一下位置,如上面没注释的,除了最后一句,其他编译没有错误。最后一句也报了相同的错误。具体原因,我也不太清楚,但是我记得曾经看过关于反射的一点看法,反射是很脆弱的,即编译器很难帮助人们发现程序中的错误。任何错误只能在运行时才被发现,并导致异常。所以,我觉得它内部应该有一定的限定了,是不是没有完全擦出泛型的信息呢?这个还有待思考。
|