黑马程序员--java中的泛型。

时间:2023-02-18 07:52:27

---------------------- 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培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima