泛型信息的擦除:在编译完后
泛型是提供给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
|
|