<? extends T>表示类型的上界,表示参数化类型可能是T或T的子类
<? super T>表示类型下界(超类型通配符),表示参数化类型是此类型的超类型(父类型),直至Object
class Fruit{}
class Apple extends Fruit{}
class Jonathan extends Apple{}
class Orange extends Fruit{}
public class Test{
public static void main(String[] args){
List<? extends Fruit> flist = new ArrayList<Apple>();
//Compile Error:can't add any type of object
//flist.add(new Apple());
//flist.add(new Fruit());
//flist.add(new Object());
flist.add(null);
Fruit fruit = flist.get(0);
Apple apple = (Apple)flist.get(0);
List<? super Fruit> flist2 = new ArrayList<Fruit>();
flist2.add(new Fruit());
flist2.add(new Apple());
flist2.add(new Jonathan());
//compile error:
//List<? super Fruit> flist2 = new ArrayList<Apple>();
//compile error:
//Fruit item = flist2.get(0);
}
}
小结:
extends 可用于返回类型限定,不能用于参数类型限定。
super可用于参数类型限定,不能用于返回类型限定。
带有super超类型限定的通配符可以向泛型对象写入,带有extends子类型限定的通配符可以向泛型对象读取。