A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 血马雄风 中级黑马   /  2015-8-28 10:11  /  123 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

泛型信息的擦除:在编译完后

泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入。
编译器编译带有类型说明的集合或类时,会去掉“类型”信息,使程序运行效率不受影响。对于泛型类型,getClass()返回值和原始类型完全一样。因此,只要跳过编译器后,使用反射就可以往泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用其add方法即可。



//main
ArrayList<Integer> intList= new ArrayList<Integer>();
ArrayList<String> strList= new ArrayList<String>();
System.out.prinln(intList.getClass() == strList.getClass()); //output:ture
//intList.add("abcc");  //error
intList.getClass().getMethod("add", Oabject.class).invoke(intList, "qaz"); //向Integer集合中加入字符串
System.out.prinln(intList.get(0));  //output: qaz



ArrayList<E>称为:泛型ArrayList
          E:称为泛型参数,或类型参数
ArrayList<Integer> 念作:ArrayList typeof Integer
    Integer称为:类型参数的实例,或实际类型参数


一种泛型就是一种类型,并且类型参数不考虑继承
//ArrayList<String> strList = new ArrayList<Object>();  //error
//ArrayList<Object> objList = new ArrayList<String>();  //error


泛型与原始类型兼容
ArrayList arrayList = new ArrayList<String>();  //success,原始类型变量可指向泛型类型
ArrayList<String> strList = arrayList;      //suceess, 泛型类型可以指向原始类型


数组
//ArrayList<String>[] arrayList = new ArrayList<String>[];  //error
ArrayList[] arrayList = new ArrayList<String>[];  //success


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马