java泛型的一个圈套-只在编译时检查(转)
java泛型的一个陷阱-只在编译时检查(转)
证明:java泛型检查只在编译期有效,而反射是在运行期的调用机制
1 用反射进行put,绕过了泛型检查;
2 get时泛型会自动进行类型转换,从而导致了ClassCastException。
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
}
证明:java泛型检查只在编译期有效,而反射是在运行期的调用机制
1 用反射进行put,绕过了泛型检查;
2 get时泛型会自动进行类型转换,从而导致了ClassCastException。
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
}