目录
泛型 的概念
所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如, 继承或实现这个接口,用这个类型声明变量、创建对象时确定(即传入实际的类型参数,也称为类型实参)。
引入背景
集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以JDK1.5之前只能把元素类型设计为0bject, JDK1.5之 后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。Collection<E>, List<E>, ArrayList<E> 这个<E>就是类型参数, 即泛型。
jdk 5.0新增特性
只有代码中有泛型的类或接口才可以在实例化时使用泛型
在集合中使用泛型之前的问题:
①、类型不安全(例如List中可以放任何类型的数据)
②、强转时,可能出现异常 (从Object强转为指定类型)
在集合中使用泛型,可以在编译时就进行类型检查,保证数据安全,同时集合中所有元素类型都是定义的泛型类型,不需要从Object强转为指定类型了
例:
List<Integer> list=new ArrayList<Integer>(); //list中所有元素都是Integer类型
Map<String,Integer> map=new HashMap<String,Integer>(); //map中所有key值都是String类型,value值都是Integer类型
总结:
① 集合接口或集合类在jdk5.0时都修改为带泛型的结构
② 在实例化集合类时,可以指明具体的泛型类型
③ 指明完以后,在集合类或接口中但凡是定义类或接口时,内部结构(比如方法、构造器、属性)都是指定的泛型类型
④ 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,用包装类代替
⑤如果实例化时,没有指明泛型的类型。默认类型是java.lan.Object类型
⑥ jdk7新特性,可以省略后面的泛型。例如List<Integer> list=new ArrayList<Integer>(); 可以写为List<Integer> list=new ArrayList<>();
java比较器使用泛型后的写法
//Comparator实现字符串从大到小排序
public class ComparatorTest {
public static void main(String[] args) {
String[] a = new String[]{"a", "bb", "c", "d", "ss", "ww", "e", "d", "f", "f"};
Arrays.sort(a, new Comparator<String>() { //直接创建匿名实现类的匿名对象,不需要再强转类型
@Override
public int compare(String o1, String o2) {
return -o1.compareTo(o2);
}
});
System.out.println(Arrays.toString(a)); //[ww, ss, f, f, e, d, d, c, bb, a]
}
}
自定义泛型结构:泛型类,泛型接口;泛型方法
自定义泛型类
public class GenericTest1 {