为什么google-collections包含语义相同的函数和奇怪的泛型?

yur*_*ura 2 java generics guava

为什么google-collections或guava包含语义上相同的功能?例:

static
<T> Predicate<T>
and(Predicate<? super T>... components) 

static
<T> Predicate<T>
and(Predicate<? super T> first, Predicate<? super T> second) 
Run Code Online (Sandbox Code Playgroud)

即所有可以接受多个参数的函数.

第二个问题为什么这些函数的定义使用泛型<? super T>而不是<T>

Col*_*inD 7

要回答第一个问题,Predicate<? super T>...当使用多个通用谓词(例如Predicate<T>)调用时,varargs version()将向您发出关于未经检查的通用数组创建的警告.对于组合两个谓词的常见情况,您不会收到该警告.

要回答第二个问题,采取Predicate<? super T>意味着您可以在调用方法时传入Predicate<Object>(Predicate<Number>或其他)来创建Predicate<Integer>.例如,如果Predicates.notNull()Predicate<Object>(因为它应该)并且你想要将它和一些组合在一起Predicate<Integer>,那么如果参数必须是类型的话就不可能Predicate<T>.