首页 > 代码库 > java中利用反射机制绕开编译器对泛型的类型限制
java中利用反射机制绕开编译器对泛型的类型限制
首先看下面这个例子
public static void main(String[] args) {
ArrayList<Integer> al1 = new ArrayList<Integer>();
al1.add(1);
ArrayList<String> al2 = new ArrayList<String>();
al2.add("hello");
//int型链表和string型链表,结果为true
System.out.println(al1.getClass()==al2.getClass());
}
这说明编译器编译带参数说明的集合时会去掉类型的信息,转化为普通的链表,所以运行时,将不会受到泛型的影响。所以可以这样来绕开泛型的限制:
public static void main(String[] args) throws Exception {
//定义一个包含int的链表
ArrayList<Integer> al = new ArrayList<Integer>();
al.add(1);
al.add(2);
//获取链表的add方法,注意这里是Object.class,如果写int.class会抛出NoSuchMethodException异常
Method m = al.getClass().getMethod("add", Object.class);
//调用反射中的add方法加入一个string类型的元素,因为add方法的实际参数是Object
m.invoke(al, "hello");
System.out.println(al.get(2));
}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。