JAVA泛型extends和super

<? 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子类型限定的通配符可以向泛型对象读取。

猜你喜欢

转载自blog.csdn.net/ecliiipse/article/details/53088257