<? extend T> 和 <? super T> 使用

<? extend T> 和 <? super T>

<? extend T> 表示通配符上限,创建的泛型都是T或T的子类。

如 class A extend Father,class B extend Father。

List<? extend Father> list = new ArrayList<Father/A/B>();都可以。但是由于不确定是Father具体哪个类型,且不确定A、B之间是否有关联。所以没办法使用list.add()方法(null除外)。就像List<String> 和 List<Integer> 不可能定义泛型后,list既能add("1"),又可以add(123);但是可以使用get()方法,因为都是Father的子类。get出来的类型肯定都是Father。

<? super T>标识通配符下限,创建的泛型都是T的父类或T。

如 class A extend Father,class B extend A,class C extend B。

List<? super A> list  = new ArrayList<Father/A>();都可以。因为明确了下限。所以list可以add的A或A的子类,如list.add(new A())、list.add(new B())、list.add(new C())。使用get的时候必须加强转才可以,否则只能用Object类来接。


PECS原则

PECS(Producer Extends Consumer Super)原则。

字面意思是生产者要被继承要被当作上界通配符<? extends E>的上界E,消费者要继承其他类要被当成下界通配符<? super E>的下界E。应该就是当这个被传入的类型需要进行很多get操作获取数据的话,那么请使用上界通配符,这时这个上界就如同生产者一样,因为它能被不断get到,而当需要不断进行add方法添加数据的话,请使用下界通配符这时这个下界就如同消费者一样,因为它不断地索取,因为我们在不断地add元素给它。

猜你喜欢

转载自blog.csdn.net/yytree123/article/details/129089021
今日推荐