泛型
- 编译的时候,检查添加元素的类型,提高安全性
- 减少类型转换,提高效率
- 可以在类声明时,通过一个标识类中某个属性的类型,或者是其他方法的返回值的类型,或者是参数类型。
- 可以表示数据类型的类型
- 实参不能是基本类型
- 在指定泛型具体类型后,可以传入该类型或其子类
- List list = new ArrayList(); 泛型默认是Object
语法
// 在编译的时候确定类型
class Person<T,E>{
T s; //程序员可以自己指定该类型,实参不能是基元数据类型
E e;
public Person(T s) {
this.s = s;
}
public T getS() {
return s;
}
}
// 接口类型
interface AA<T>{
}
细节
自定义泛型类
- 普通成员可以使用泛型
- 使用泛型的数组不能初始化
- T[] ts = new T[8];//错误
- 静态方法、属性中不能使用类的泛型
- 静态方法是与类加载有关的,而泛型的类型是由创键的对象确定的
- 泛型类的类型,是在创建对象时确定的
- 没有指定类型,默认为Object
自定义泛型接口
- 接口中,静态成员也不能使用泛型
- 泛型接口的类型,在继承接口或者实现接口时确定
- 没有指定类型,默认Object
// 当实现IB接口时, 因为IB在继承IUsb时指定了类型
// 在实现方法时,自动替换
class AA implements IB{
@Override
public Double get(String s) {
return null;
}
@Override
public void hi(Double aDouble) {
}
@Override
public void run(Double r1, String u1, String u2) {
}
}
//实现接口时,直接指定泛型接口的类型
class BB implements IUsb<Integer,Float>{
@Override
public Float get(Integer integer) {
return null;
}
@Override
public void hi(Float aFloat) {
}
@Override
public void run(Float r1, Integer u1, Integer u2) {
}
}
//继承时,没有指定参数
interface CC<R,U> extends IUsb<R,U>{
}
//默认Ojbect
class DD implements IUsb{
@Override
public Object get(Object o) {
return null;
}
@Override
public void hi(Object o) {
}
@Override
public void run(Object r1, Object u1, Object u2) {
}
}
自定义泛型方法
修饰符 <T,R> 返回类型 方法名(参数列表){}
- 可以定义在普通类中
- 可以定义在泛型类中
- 使用该方法时就确定该泛型类型
- public void eat(E e ,T t){};没有,<E,T> 修饰时,不是泛型方法,而是使用类声明的泛型
- 泛型方法可以使用类声明的泛型,也可以是自己声明的泛型
//普通类中
class Car{
private void run(){
}
//泛型方法
public <T> void fly(T t){
}
}
//泛型类中
class Fish<T,R>{
T t;
R r;
public <C> void eat(C c){
}
public <C> void eat(C c,T t){
}
}
泛型的继承和通配符
- 泛型不具有继承性
- List< object > list =new ArrayLsit< String >();//错误
- < ?> 支持任意类型
- < ? extends A > 支持A及A的子类 ,表示泛型的上限
- < ? super AA> 支持AA及AA的父类,不限于直接父类,表示泛型的下限