本帖最后由 戴振良 于 2014-1-6 20:57 编辑
我是一名老黑马程序员了,好久没来论坛了,因为最近换了工作了,最近发觉自己好多基础东西都不会,回过头来学Java基础了,看了Java基础加强,遇到了个问题,于是想到黑马来问问大家。
在张孝详老师的高新技术教程中,视频“37_泛型的内部原理及更深应用.avi”中说到了,当class转换成字节码存入内在时会去掉泛型信息,因此通过反射可以跳过泛型的约束,如下例子的ArrayList限定了只能存入Integer类型的对象,但是通过反射存入了字符串“abc”: ArrayList<Integer> list =new ArrayList<Integer>(); Method addMethod = list.getClass().getMethod("add", Object.class); addMethod.invoke(list, "abc"); System.out.println(list.get(0)); 运行通过,并输出abc 把上面的Integer替换为String,把"abc"替换为1,其他不变如下: ArrayList<String> list = newArrayList<String>(); Method addMethod =list.getClass().getMethod("add", Object.class); addMethod.invoke(list, 1); System.out.println(list.get(0)); 编译通过,运行报错,如下: Exception in thread"main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String atcom.dzl.demo.Main.main(Main.java:19) 问题:这里的错误很明显是说运行时是知道了这个list的泛型信息,即知道了list只能存String,不然为什么会说Integer不能转换为String呢?如果真是这样,为什么第一个例子又不报String不能转换为Integer的异常呢? 哎,要是张老师还在就可以直接问问他了,好怀念张老师啊。 补充,我所用的jdk版本是1.6
|