在jdk1.5之前,没有指定泛型类型的时候,我们可以向集合中添加任意元素的对象。在获取集合元素的过程中,需要我们明确的知道使用的元素的类型,否则会出现ClassCastException异常。这种异常是在运行时异常,在编译期发现不了这种异常。针对这种情况,JDK1.5推出新特性-泛型,泛型提供了编译期类型检测机制,可以在编译期检测到非法的数据类型 。泛型的本质就是参数化类型,也就是所操作的数据类型是一个参数。
泛型使用方式泛型类
泛型接口
泛型方法
泛型类class 类名 <泛型标识,泛型标识,...>{
private 泛型标识 变量名;
}
常用的泛型标识
T、E、K、V
泛型类不允许是基本数据类型因为基本数据类型没有父类,而泛型其实是属于Object
public class Generic {
public static void main(String[] args) {
AAA aaa = new AAA<>("2");
System.out.println(aaa);
AAA bbb = new AAA<>(true);
System.out.println(bbb);
}
}
@Data
@AllArgsConstructor
class AAA{
private T key;
}
泛型父子类
子类的泛型需要和父类泛型一致
子类不是泛型类,父类是泛型类时,父类必须指定具体的泛型类型
泛型接口inteeface 接口名称<泛型标识、泛型标识>{
泛型标识 方法名();
}
实现类不是泛型类,接口必须指定具体的泛型类型
实现类也是泛型类,需要和接口的泛型类型一致
泛型方法修饰符 <泛型列表> 返回值(){
}
类型通配符
用?代替具体的类型实参:无限通配符
类型通配符的上限
类/接口 extends 实参类型>:?是子类只能传父类以及父类的子类
类型通配符的下限
类/接口 super 实参类型>:?是父类,只能传?以及本身,不能传本身的子类
类型擦除由于泛型是JDK1.5引出的,在这之前没有这个概念,泛型信息能够很好的兼容之前的代码。是因为:泛型信息只存在于编译期,在运行阶段,与泛型相关的信息会被擦除,称之为泛型擦除。
对于无限制通配符的擦除方式:
>会被替换成Object
上下限通配符
父类
桥接法对于泛型多态出现的问题,JVM的解决方式是桥接方法



