Java 泛型

前言

1、泛型

  • 泛型 是在容器后面添加 <Type>。表示这种容器只能存放指定的数据类型,别的类型(除子类外)是放不进去的,获取的时候也不需要进行转型。

    1
    2
    3
    4
    // 数组容器 ArrayList
    public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    }
  • Type 可以是类,抽象类,接口。

    1
    2
    ArrayList<Hero> heros = new ArrayList<Hero>();
    ArrayList<Hero> heros = new ArrayList<>(); // 后面的泛型类型 Type 可以省略

2、支持泛型的类

  • 设计一个支持泛型的栈 MyStack

    • 设计这个类的时候,在类的声明上,加上一个 <T>,表示该类支持泛型。
    • Ttype 的缩写,也可以使用任何其他的合法的变量,比如 A, B, X 都可以,但是一般约定成俗使用 T,代表类型。
  • 设计支持泛型的类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class MyStack<T> {

    LinkedList<T> values = new LinkedList<T>();

    public void push(T t) {
    values.addLast(t);
    }

    public T pull() {
    return values.removeLast();
    }

    public T peek() {
    return values.getLast();
    }
    }
  • 使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public static void main(String[] args) {

    // 在声明这个 Stack 的时候,使用泛型 <Hero> 就表示该 Stack 只能放 Hero
    MyStack<Hero> heroStack = new MyStack<>();
    heroStack.push(new Hero());

    // 不能放 Item
    heroStack.push(new Item());

    // 在声明这个 Stack 的时候,使用泛型 <Item> 就表示该 Stack 只能放 Item
    MyStack<Item> itemStack = new MyStack<>();
    itemStack.push(new Item());

    // 不能放 Hero
    itemStack.push(new Hero());
    }

3、通配符

通配符 介绍 读写
? 代表任意泛型 ArrayList<?> heros,只能以 Object 的形式取出来,不能插入
? extends 指定类泛型或者其子类泛型 ArrayList<? extends Hero> heros,只能取出,不能插入
? super 指定类泛型或者其父类泛型 ArrayList<? super Hero> heros,只能插入,不能取出
  • 如果希望,又能插入,又能取出,就不要用通配符。

4、泛型转型

  • 泛型转型

    • 子类对象转父类对象是可以成功的。
    • 子类泛型不可以转换为父类泛型。
文章目录
  1. 1. 前言
  2. 2. 1、泛型
  3. 3. 2、支持泛型的类
  4. 4. 3、通配符
  5. 5. 4、泛型转型
隐藏目录