如果没有给集合指定类型,默认所有类型都是objest,在获取数据时,无法使用他的特有行为
因此泛型在JDK5引入,可以在编译阶段约束操作的数据类型
格式:
<数据类型>
注意:
泛型只支持引用数据类型
java是伪泛型,数据添加到集合里时还是会当成Object类型
细节:
泛型中不能写基本数据类型
指定泛型的具体类型,传递数据时可以添加该类子类类型
不写泛型,默认object类型
泛型类
当类中的某个变量数据类型不确定时,可以定义带有泛型的类,本类所有方法都能使用
修饰符 class 类名<E|任意字母>{
}
泛型方法
只有一个方法形参不确定时,可以定义带有泛型的方法
修饰符 <E|任意字母> 返回值类型 方法名(类型 变量名){}
当方法调用时类型确定下来
泛型接口
1.实现类给出具体类型
定义了一个只能添加String类型的List的子类
2.实现类延续泛型,创建对象时候再给出类型
泛型的类型绑定
有时候,你会希望泛型类型只能是某一部分类型,比如操作数据的时候,你会希望是Number或其子类类型。这个想法其实就是给泛型参数添加一个界限
<T extends Type>
此定义表示T跟Type应该是继承关系或实现关系。T和Type可以是类,也可以是接口。
类型绑定有两个作用:
1、对填充的泛型加以限定 ,类型没有派生自Type则会报错。
2、使用泛型变量T时,可以使用Type内部的函数。
有关绑定限定的用法,其实我们可以同时绑定多个绑定,用&连接
<T extends Type1&Type2>
泛型的继承和通配符
泛型不具备继承性,但是数据具备继承性
底下是一个例子
class fu{} class zi extend fu{} class test { public static void main(){ ArrayList<fu> list1=new ArrayList<>(); ArrayList<zi> list2=new ArrayList<>(); method(list2)//报错 list1.add(new(zi));//不报错,多态 } public static void method(ArrayList<fu> list){} }
当方法参数不确定类型时,使用泛型
public static void <E> method(ArrayList<E> list){} }
但此时方法能接收所有类型的数据,当,就可以使用泛型的通配符,来进行类型的限定
?表达不确定的类型,方法前面可以不用限定
? extend E:表达E或E所有的子类类型
? super E表达E或E所有的父类类型