Stream 中的很多方法接收的参数的泛型都使用了下界通配符,比如:
boolean allMatch(Predicate<? super T> predicate);
这里 Predicate 的泛型为什么不直接用 T 呢?
T只能替代某个具体的类型,而?可以匹配多个类型,这里使用?是为了兼容具有父子关系的类型,即是为了更好的支持拓展。