Java泛型

587 阅读2分钟

概述

  1. 泛型是一种把类型在对象被创建,或方法被调用的时候才去明确类型的特殊类型
  2. 也被称为参数化类型,把类型当作参数传递。
  3. 格式 <数据类型> , 该类型只能是引用类型。

泛型的应用

泛型类

  1. 把泛型定义在类上
  2. 格式 public class 类名<泛型类型1, ....>
  3. 注意:泛型必须是引用类型
// 定义泛型类
public class ObjectTool<T> {
    private T obj;
    public T getObj() {
        return obj;
    }
    public void setObj(T obj) {
        this.obj = obj;
    }
}

泛型方法

  1. 把泛型定义在方法上
  2. 格式:public <泛型类型> 返回类型 方法名(泛型类型 参数名,。。。)
public <T extends Number> Double sum(T value1, T value2) {
        double v = value1.doubleValue() + value2.doubleValue();
        return v;
}

泛型接口

  1. 把泛型定义在接口上
  2. 格式 public interface 接口名<泛型类型, ...>
public interface GenericInterface<T> {
    void show(T value);
}

泛型接口的实现类

  1. 第一种实现方式,在声明类实现接口时,直接指定接口上泛型的具体类型
public class GenericImpl implements GenericInterface<String> {
    @Override
    public void show(String value) {
        System.out.println("value = " + value);
    }
}
  1. 第二种实现方式,在声明类实现接口不指定具体类型,而是在实例化对象的时候再指定具体类型
  2. 此时,必须要声明泛型类,将该类的泛型指定给接口上的泛型,作为接口上泛型的具体类型
public class GenericImpl<T> implements GenericInterface<T> {
    @Override
    public void show(T value) {
        System.out.println("value = " + value);
    }
}

泛型通配符 <?>

  1. 使用泛型类或方式时,如果不知道使用什么类型,可以用 ? 表示任意类型,? 表示Object以及任意的Java类
  2. 泛型使用时如果明确指明类型,类型前后指定必须一致
// 正确
Collection<Object> c1 = new ArrayList<Object>();
// 编译报错
Collection<Object> c2 = new ArrayList<Animal>();
  1. ? 号类型才是表示泛型的任意类型
// 编译正确
Collection<?> c2 = new ArrayList<Animal>();
  1. ? extends E : 向下限定,E类型及其子类类型
// 编译正确
Collection<? extends Animal> c2 = new ArrayList<Animal>();
Collection<? extends Animal> c3 = new ArrayList<Dog>();`
  1. ? super E : 向上限定,E及其父类
// 编译正确
Collection<? super Dog> c2 = new ArrayList<Animal>();
Collection<? super Dog> c3 = new ArrayList<Dog>();`

泛型擦除