泛型
定义
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,在用到的时候指定具体的类型。
这种参数类型可以使用在类,接口和方法的创建中,分别称为泛型类,泛型接口和泛型方法,泛型的类型将来传入只能是引用类型的,不能是基本类型的
只在编译期间起作用
java中的泛型只是在编译期间启动类型安全检查的作用,在运行时不起作用
泛型类
一个泛型类就是具有一个或者多个类型变量(把类型参数化)的类。
定义一个泛型类只需要在类名后面加上<>,再在里面加上类型参数
泛型接口
一个泛型接口就是具有一个或者多个类型变量的接口。同样定义个泛型接口只需要在接口名后面加上<>,再在里面加上类型参数
泛型方法
在方法上直接声明泛型,这个方法就是泛型方法,如果传入方法的参数是类型变量,那么需要在返回值类型前面加上<>,再在里面加上类型参数。
public class Test{
public <T> void run1(T t){
}
public <T> T run2(T t){
return t;
}
public <T,S> void run3(T t,S s){
}
}
通配符
泛型中?是通配符,它表示所有泛型的父类型.
List<?> list = new ArrayList<任意>();
这时list可以指向任何泛型的List类型集合对象.
extends和super
在泛型中可以使用extends和super关键字来表示将来用户所传的泛型参数的上下限。
extends关键字的使用
public class Point<T extends Number> {
private T x;
private T y;
}
表示传入的泛型参数T只能是Number类及其子类。
在声明泛型方法时使用extends
public <T extends Action> void run(T t){
}
在声明泛型类型变量时使用extends
public void test(List<? extends Number> list){
}
main:
List<? extends Number> list = new ArrayList<Integer>();
List<? extends Number> list = new ArrayList<Long>();
List<? extends Number> list = new ArrayList<Double>();
super关键字的使用
声明泛型类和泛型接口的时候不能使用super
声明泛型方法时不能使用super。
声明泛型变量时候可以使用super。
List<? super Number> list1 = new ArrayList<Object>();//声明泛型类型变量
void run(List<? super Number> list) {
}
泛型中的&
使用&可以给泛型加多个限定
public class Point<T extends A&B> {
}
class Sub extends A implements B{}
不管这个限定是类还是接口,都使用关键字extends,可以使用&符号给出多个限定,如果这个限定既有接口又有类,那么只能有一个类并且放在首位。这个泛型类限定了将来所传入的类型必须是A的子类且同时是B的实现类。