Java Stream 中的方法参数的泛型为什么用通配符?

Stream 中的很多方法接收的参数的泛型都使用了下界通配符,比如:

    boolean allMatch(Predicate<? super T> predicate);

这里 Predicate 的泛型为什么不直接用 T 呢?

T只能替代某个具体的类型,而?可以匹配多个类型,这里使用?是为了兼容具有父子关系的类型,即是为了更好的支持拓展。