1、<? extends T>:参数的类型可能是T或者T的子类。
<? super T>:参数的类型可能是是T或T的父类。
用extends还是super遵循PECS原则。实例化的时候应该指定具体的类型,不指定会有警告。例如:
List<? extends Fruit> flist = new ArrayList<Apple(T和子类类型)>();
List<? super Fruit> flist = new ArrayList<Fruit(T和父类类型)>();
2、PECS:(Producer Extends Customer Super)
生产者extends,频繁往外读取内容;消费者super,经常往里面插入数据。
3、<? extends T>:不能add,可以get;<? super T>不能get,可以add。get和add的都是T和T的子类。
从安全性和不确定性两个方面考虑:
<? extends T>:编译器无法确定List所持有的类型,所以无法安全的向其中添加对象,比如实例化类型为Apple,加入的为Fruit,发生强转类型错误。get的时候得到父类或者子类强转父类不会有安全问题。
<? super T>:列表的类型最少都是一个T,所以可以往里添加T和T的子类,比如添加apple,但是get的时候无法确定返回的类型是T还是T的父类,父类强转子类不能安全转换。