java泛型检查只在编译期有效,而反射是在运行期的调用机制。

来源:互联网 发布:诚邀辣妹 网络性与爱 编辑:程序博客网 时间:2024/05/16 23:55
java泛型检查只在编译期有效,而反射是在运行期的调用机制。 

比如下面这个例子: 

Map<String, String> map = new HashMap<String, String>();          String key = "key";          Integer val = new Integer(1);          Method m = HashMap.class.getDeclaredMethod("put", new Class[] { Object.class, Object.class });          m.invoke(map, key, val);            System.out.println(map); //{key=1}          System.out.println(map.get(key)); // java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String      }  

用反射进行put,绕过了泛型检查;get时泛型会自动进行类型转换,从而导致了ClassCastException。


另一个例子:

/** * 3、 ArrayList<Integer> list = new ArrayList<Integer>();             在这个泛型为Integer的ArrayList中存放一个String类型的对象。*/import java.util.*;import java.lang.reflect.*;import java.lang.*;class ListTest3{public static void main(String[] args) throws Exception{ArrayList<Integer> al = new ArrayList<Integer>();//al.add("hahah");Class clazz = ArrayList.class; //获取字节码对象.Method me = clazz.getMethod("add", Object.class); //反射方法.me.invoke(al,"我是字符串"); //运行方法.System.out.println(al);}}

黑马论坛里这道题也是的。


0 0
原创粉丝点击