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

时间:2011-06-06 13:40:43

标签: 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) 

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

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

2 个答案:

答案 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)

另请查看Generics Tutorial Page 18