一、定义
定义类、接口、方法时,同时声明了一个或者多个类型变量,成为泛型类、泛型接口、泛型方法,统称为泛型。
如下需要的结果类型是String,实际的是obj,那么我们来看看强制类型转换以后会发生什么:
报错:类型转换异常,不能把对象直接转换成字符串
为了避免这种异常,可以用泛型解决:
当我们在ArrayList后面加上<String>以后,可以看到add提示中就是String变量了
此时再添加别的类型的变量就会报错了:
泛型的作用:提供了在编译阶段约束所能错做的数据类型,并自动进行检查,这样可以避免强制类型转换时可能出现的异常。
泛型的本质:把具体的数据类型作为参数传给类型变量。
二、泛型类
泛型类的格式:
修饰符 class 类名<类型变量,类型变量,...>{
}
声明多个变量的情况:
也可以是继承的类型:
这是操作的对象是继承的对象的子类也是可以的。
三、泛型接口
修饰符 interface 接口名<类型变量,类型变量,...>{
}
public interface A<E>{
...
}
同样泛型接口的类型变量也是可以继承别的类型的
四、泛型方法
修饰符<类型变量,类型变量,...> 返回值类型 方法名(形参列表){
}
可以使用extends进行限定:这样Dog的子类也可以被接受
?是通配符,在使用泛型的时候可以代表一切类型:
同样的通配符也可以进行限定:
也有? super Dog表示只能是Dog或者它的父类
注意,E T K V是在定义泛型的时候使用
五、擦除问题、基本数据类型问题
1. 泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,会把,这就是泛型擦除。
2. 泛型不支持基本数据类型,只能支持对象类型(引用数据类型)
整型->Integer
小数->Double