本帖最后由 chslzj 于 2013-7-7 11:44 编辑
定义了一个ArrayList<String> 对象,通过反射绕过了编译器,传入一个Integer类型的值,输出时会抛异常。定义ArrayList<Integer>对象,通过反射绕过编译器,传入String类型的值,输出时却不会抛异常,这是为什么呢?- /**
- *
- */
- package com.itheima.test;
- import java.util.ArrayList;
- import java.util.Vector;
- /**
- * @author Administrator
- *
- */
- public class GenericTest {
- public static void main(String[] args) throws Exception{
- //数组定义的时候不能这样设置泛型
- //Vector<String> vectorList[]=new Vector<String>[10];
- Vector<String> vectorList=new Vector<String>();
- //这样定义了一个泛型,编译的时候只能加入String类型的数据
- ArrayList<String> collection1 = new ArrayList<String>();
- collection1.add("abc");
- //collection1.add(123); 123加不进去
- String element = collection1.get(0);
- //在字节码里面是没有关于泛型的信息的,我们可以通过反射绕过泛型的设置
- ArrayList<Integer> collection2 = new ArrayList<Integer>();
- collection2.add(2);
- collection2.getClass().getMethod("add", Object.class).invoke(collection2, "abc");
- System.out.println(collection2.get(0));
- System.out.println(collection2.get(1));//Integer类型成功绕过编译器
- //这里就证明了字节码里面是没有泛型信息的
- System.out.println(collection1.getClass() == collection2.getClass());
- collection1.getClass().getMethod("add", Object.class).invoke(collection1, 99);
- System.out.println(collection1.get(0));
- System.out.println(collection1.get(1));//这里为什么就不行了呢?
-
- }
- }
复制代码 |