泛型概述
- JDK1.5引入了“参数化类型”的概念,允许我们在创建对象时再指定元素的类型。
- 在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型在使用时再指定具体类型。
泛型的引入背景
集合容器类在设计阶段不能确定这个容器到底实际存的是什么类型的对象,所以在Java 5之前只能把元素类型设计为Object,Java 5之后使用泛型来解决。因为这个时候除了元素的类型不确定,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。Collection<E>,List<E>,ArrayList<E> 这个<E>就是类型参数,即泛型。
泛型的优点
- 泛型就是解决类接口方法的复用性、以及对不特定数据类型的支持
- 解决元素存储的安全性问题,比如类型不对编译期就会报错不通过
- 解决获取数据元素时,需要类型强制转换的问题
泛型定义
- 泛型的参数类型只能是类( class )类型,而不能是简单(int)类型。
- 泛型类 [访问修饰符] class 类名称 <T>
- 泛型接口 [访问修饰符] interface 接口名称 <T>
- 泛型方法 [访问修饰符] <T> 返回值 方法名称(参数)public <T> T test(T t){ return t;}
- 可以声明多个泛型参数类型,比如 <T, P,Q…> ,同时还可以嵌套泛型,例如: <List<String>>
- 泛型 的参数 类 型可以使用 extends 语 句,例如 <T extends superclass> 。
- 泛型的参数类型可以使用 super 语句,例如 < T super childclass> 。
- 泛型还可以使用通配符,例如 <? e xtends ArrayList>
extends 和 super 说明
- 使用extends语句将限制泛型参数的适用范围 。<T extends collection> ,则表示该泛型参数的使用范围是所有实现了collection接口的calss。
- super语句的作用与extends一样,都是限制泛型参数的适用范围 。区别在于,super是限制泛型参数只能是指定该class的上层父类。