javase-泛型

402 阅读2分钟

泛型

  1. 编译的时候,检查添加元素的类型,提高安全性
  2. 减少类型转换,提高效率
  3. 可以在类声明时,通过一个标识类中某个属性的类型,或者是其他方法的返回值的类型,或者是参数类型。
  4. 可以表示数据类型的类型
  5. 实参不能是基本类型
  6. 在指定泛型具体类型后,可以传入该类型或其子类
  7. 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>{
    
}

细节

自定义泛型类

  1. 普通成员可以使用泛型
  2. 使用泛型的数组不能初始化
    1. T[] ts = new T[8];//错误
  3. 静态方法、属性中不能使用类的泛型
    1. 静态方法是与类加载有关的,而泛型的类型是由创键的对象确定的
  4. 泛型类的类型,是在创建对象时确定的
  5. 没有指定类型,默认为Object

自定义泛型接口

  1. 接口中,静态成员也不能使用泛型
  2. 泛型接口的类型,在继承接口或者实现接口时确定
  3. 没有指定类型,默认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> 返回类型 方法名(参数列表){}

  1. 可以定义在普通类中
  2. 可以定义在泛型类中
  3. 使用该方法时就确定该泛型类型
  4. public void eat(E e ,T t){};没有,<E,T> 修饰时,不是泛型方法,而是使用类声明的泛型
  5. 泛型方法可以使用类声明的泛型,也可以是自己声明的泛型
//普通类中
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){

    }
}

泛型的继承和通配符

  1. 泛型不具有继承性
    1. List< object > list =new ArrayLsit< String >();//错误
  2. < ?> 支持任意类型
  3. < ? extends A > 支持A及A的子类 ,表示泛型的上限
  4. < ? super AA> 支持AA及AA的父类,不限于直接父类,表示泛型的下限