(一)泛型 (Generic)
1. 为什么要使用泛型(Generic)
- 泛型:标签
- 泛型设计的背景:集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。Collection<E>,List<E>,ArrayList<E> 这个<E>就是类型参数,即泛型。
2. 泛型的概念:
所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实
际的类型参数,也称为类型实参)。
3. 为什么要有泛型
那么为什么要有泛型呢,直接Object不是也可以存储数据吗?
1. 解决元素存储的安全性问题,好比商品、药品标签,不会弄错。2. 解决获取数据元素时,需要类型强制转换的问题,好比不用每回拿商品、药
品都要辨别。
java的泛型可以保证如果程序在编译的时候没有发出警告,运行时就不会产生ClassCastException异常
同时代码更加简洁,壮健
4. 代码示例(List集合和Map集合)
@Test
public void test(){
// 类型推断
ArrayList<Integer> list = new ArrayList<>();
list.add(78);
list.add(88);
list.add(77);
list.add(66);
// 遍历方式一
for (Integer i : list) {
// 不需要进行强制转换
System.out.println(i);
}
// 遍历方式二
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
@Test
public void test2(){
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Tom1",34);
map.put("Tom2",44);
map.put("Tom3",33);
map.put("Tom4",32);
// 添加失败
// map.put(33,"Toms");
Set<Map.Entry<String,Integer>> entries = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
while(iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
System.out.println(entry.getKey() + "--->" + entry.getValue());
}
}
5. 集合中使用泛型的总结
- 集合接口或集合类在jdk5.0时都修改为带泛型的结构。
- 在实例化集合类时,可以指明具体的泛型类型
- 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型。
- 比如:add(E e) --->实例化以后:add(Integer e)
- 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换
- 如果实例化时,没有指明泛型的类型。默认类型为java.lang.Object类型。