java泛型检查只在编译期有效,而反射是在运行期的调用机制。
用反射进行put,绕过了泛型检查;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
}
用反射进行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);
}
}
黑马论坛里这道题也是的。