# 泛型

# PECS

Producer Extends Consumer Super

如果参数化类型表示一个生产者,就使用 <? extends T>;如果它表示一个消费者,就使用 <? super T>。

List<? extends Fruit> 的泛型集合中,对于元素的类型,编译器只能知道元素是继承自 Fruit,具体是 Fruit 的哪个子类,这是无法知道的,所以向一个无法知道具体类型的泛型集合中插入元素是不能通过编译的;但是,由于知道元素是继承自 Fruit,所以从这个泛型集合中取 Fruit 类型的元素是可以的。

List<? super Apple> 的泛型集合中,元素的类型是 Apple 的父类,但无法知道是哪个具体的父类,因此读取元素时无法确定以哪个父类进行读取;插入元素时,可以插入 Apple 与 Apple 的子类,因为这个集合中的元素都是 Apple 的父类。

只读不可写时,使用 List<? extends Fruit>: Producer 只写不可读时,使用 List<? super Apple>: Consumer

# 通配符

  • ? 表示不确定的 java 类型
  • T 表示具体的 java 类型 (type)
  • K V 表示 java 键值中的 Key Value (key value)
  • E 表示 Element (element)

# 泛型方法

public static <E> void printArray( E[] inputArray ) {
    for ( E element : inputArray ){
        System.out.printf( "%s ", element );
    }
    System.out.println();
}

# 泛型类

public class Box<T> {
    private T t;
    public void add(T t) {
        this.t = t;
    }
    public T get() {
        return t;
    }
}

# 参考链接