今天看了下jdk8的Function源码,发现好多地方的方法传递参数都是如下这般:
Function<? super V, ? extends T> before
这个其实就是泛型的上下界:
上界 <? extend T>
下界 <? super T>
上界的list只能get,不能add
下界的list只能add,不能get
具体看代码示例:
public class Pecs {
public static void main(String[] args) {
//list作为消费者的时候,添加元素到列表
List<? super A> list = new ArrayList<>();
list.add(new C());
list.add(new B());
list.add(new A());
//list1作为生产者的时候,循环获取元素
List<? extends A> list1 = (List<? extends A>)list;
for (A a : list1) {
System.out.println(a.getClass().getName());
}
}
}
这就是著名的PECS原则,PECS指“Producer Extends,Consumer Super”。