为什么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)
即。所有可以接受多个参数的函数。
为什么定义这些函数的第二个问题是使用泛型<? super T>
而不是<T>
?
答案 0 :(得分:7)
要回答第一个问题,当使用多个通用谓词(例如Predicate<? super T>...
)调用时,varargs版本(Predicate<T>
)会向您发出有关未经检查的通用数组创建的警告。对于组合两个谓词的常见情况,您不会收到该警告。
要回答第二个问题,取Predicate<? super T>
表示您在调用方法创建Predicate<Object>
时可以传递Predicate<Number>
(或Predicate<Integer>
或其他)。例如,如果Predicates.notNull()
是Predicate<Object>
(应该是)并且您希望将它与某些Predicate<Integer>
结合起来,那么如果要求参数类型是不可能的话Predicate<T>
。
答案 1 :(得分:0)
第一部分是表现,我相信。
在第二部分中它必须是<? super T>
,因为Guava允许你输入任何可以在任何超类型的T和T本身上进行评估的谓词。不只是T本身就像<T>
一样。
这是有道理的,因为特定谓词可能更通用,因此在更一般的类型上定义,但您想要将它与某些子类型一起使用。
您在TreeSet构造函数中看到相同的内容:TreeSet(Comparator<? super E> c)
。