(PPT来源:bilibili网站-黑马程序员)
泛型
泛型之前,可以构造元素类型为 Object 集合来存储任意数据类型的对象;但该集合的使用中,如果不能一一明确每一个元素的数据类型,在运行时容易发生ClassCastException异常;且对所有元素不能统一处理。
泛型优点:
提供了编译时类型安全监测机制,编译期间检查非法类型数据结构
减少后续操作数据时的数据类型转换
同一泛型类,根据不同的数据类型创建的对象,本质上是同一类型
泛型类派生子类
子类只要有父类的泛型标识即可,在此基础上还可以进行泛型扩展(类中还需要其他的数据类型)
子类不是泛型类时,可以当作普通类来处理
泛型接口
eg:
public class Apple implements Eat < String > {…}
public class Apple < T > implements Eat < T > {…}
泛型方法
定义泛型方法
test:创建一个泛型类,在泛型类中调用了泛型方法
泛型方法的数据类型独立于泛型类,即可以和泛型类的数据类型不一致,泛型方法更加灵活
普通成员方法,在采用了类的泛型标识后,则不能被声明为静态方法
但泛型方法支持静态
泛型方法与可变参数
类型通配符
Box 泛型类设置好后,使用时定义了 Number 数据类型,所以只接Number,不接收 Integer 等其他类型,此处是泛型,不能采用多态思想觉得写父类子类都可以用
(再次强调:虽然泛型类中泛型类型可以不同,但本质上泛型类都是同一类型,即泛型类名字的这个类型)
所以想要接收多种数据类型,可以将< >中写成< ? >表示接收多种数据类型
类型通配符的上限
此时可以接收 Number 类型 以及 Number 类型的子类
eg:
上限通配符只能用于创建对象时对传入的数据类型进行约束,但不能用于直接添加新元素:
类型通配符的下限
下限通配符可以进行元素添加,但不保证元素的约束要求,所以需要用Object 数据类型来接收:
类型擦除
编译完成后,泛型信息都被擦除掉了,本质上都是泛型类名的那个类型
类型擦除后的方法与多态发生了冲突时,编译器采用桥接方法擦除类型
泛型数组
创建好带泛型的类,将普通类的值导入到泛型类中:
但如果不小心,容易发生ClassCastException
最优做法:直接将普通类的匿名对象赋给泛型数组的引用