---------------------- android培训、java培训、期待与您交流! ----------------------
泛型是JDK1.5之后比较重要的新特性
泛型的好处?
List list = new ArrayList();
list.add(1);
list.add("hello");
list.add(2L);
定义一个数组没有指定泛型,任何类型的数据都可以添加到数组里。并且编译能顺利通过!
int a = (Integer)list.get(2);
但是当我们取出数据的时候,并不知道数据对应的索引存储的是什么类型的数据
程序在运行时就会报错。
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("你好");
list.add("黑马");
当我们给数组指定了一个String类型的参数<String>,那么我们在往数组添加数据时就只能添加String类型的数据
String a = list.get(2);
并且我们取出数据时,也避免了强制转换的麻烦,因为我么在定义数组时已经明确数组只能存储String类型的数据
list.add(1);
要是添加其他类型的数据,编译会不通过。
这就是泛型的好处,把运行时异常转换成编译时异常,可以限定集合中的存储类型,让编译器挡住源程序中非法输入,
编译器编译带类型说明的集合时会去掉"类型"信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回
值和原始类型完全一样。由编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中假如其他类型
的数据,
例如,用反射得到集合,再调用起add方法即可。
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("你好");
list.add("黑马");
Method method = list.getClass().getMethod("add", Object.class);
method.invoke(list, 1);
System.out.println(list);
这样我们就可以跳过编译器,通过反射将int类型的数据存储到指定了String泛型的数组里。
---------------------- android培训、java培训、期待与您交流! ----------------------