泛型的概念:其本质是参数化的类型,把类型作为参数传递
常见的形式有:泛型类,泛型方法,泛型接口
好处:1. 编译器编译期间检查2.减少了数据类型转换
注意事项:1.java里面的泛型只能是引用类型
2.demo20<String> stringdemo20 = new demo20<>();注意当你实例化泛型这个类的时候尖括号里面传的必须是引用类型不能是基本类型
3.不同类型的泛型对象不能相互赋值
4.泛型类型逻辑上可以看成是多个不同的数据类型,但是实际上都是相同类型
泛型接口:
* 语法:接口名,<T>
* 注意:泛型接口不能创建静态常量
* 泛型类型可以是方法的传参的类型
* 泛型接口:在实现这个接口的时候创建类的时候可以直接定义泛型类
* 可以在定义接口前定义泛型的类型也可以在定义接口的时候把类也变成泛型最后根据传得值定义他的类型
* 当实现泛型接口的类 不是泛型接口的时候,需要明确泛型接口的类型
* 当实现泛型接口的类是泛型类的时候 实现接口的泛型类的泛型标识符必须包含泛型接口的标识符
泛型继承:
*子类如果是泛型类需要跟父类的泛型类型相同
*如果子类不是泛型类父类需要明确自己的泛型类型
*如果子类也是泛型类那么子类的泛型标识符就一定要跟父类的相同
*如果子类不是泛型类在实例化子类时候那么将会把他当做普通类来处理
泛型方法 * list:这里表示的是参数
* E:这里表示的是泛型标识,标识类型,有调用方法的时候具体声明是什么类型
public <E> E getProduct(ArrayList<E> list) {
return list.get(random.nextInt(list.size()));
}
*当你定义的泛型方法跟泛型类的标识符虽然一致但是他们的使用完全没关系
*泛型方法可以进行静态修饰
*泛型方法可以支持可变参数
**泛型方法的总结:泛型方法能使方法独立于类产生方法 能用泛型方法解决的尽量不要用泛型类因为泛型类更加灵活
*只有泛型的方法他才支持静态修饰
泛型类 *当普通的泛型方法采用了类的泛型那么将不能使用静态的修饰
类型通配符;什么是类型通配符:类型通配符就是一个?代替具体的形式实参,所有类型通配符是形式实参而不是类型实参
注意这里的?是实际参数
不能通过多态或者继承去理解 代码见package demo19;的Test06
通配符的上限:语法:<?extends 引用实参类型>
要求:该泛型类型只能是实参类型或者是这个是参类型的子类类型
注意:上限通配符是不能够往集合里面使用add去添加元素的,但是可以使用addAll添加符合条件的元素不能超过他的最大通配符可以是他的子类
通配符的下限:语法:<?super 引用实参类型>
要求:该泛型类型只能是实参类型或者是这个是参类型的父类类型
类型擦除:概念泛型的信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我么称之为类型能够擦除
泛型数组:创建:可以生命泛型的数组引用,但是不能直接创建带泛型数组的对象