为什么 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>
?
最佳答案
要回答第一个问题,varargs 版本 ( Predicate<? super T>...
) 会警告您在使用多个通用谓词(例如 Predicate<T>
)调用时未经检查地创建通用数组。对于组合两个谓词的常见情况,您不会收到该警告。
回答第二个问题,服用Predicate<? super T>
意味着你可以传入 Predicate<Object>
(或 Predicate<Number>
或其他)调用创建 Predicate<Integer>
的方法时.例如,如果 Predicates.notNull()
是Predicate<Object>
(因为它应该是)你想把它和一些 Predicate<Integer>
结合起来, 如果要求参数的类型为 Predicate<T>
则不可能.
关于java - 为什么 google-collections 包含语义相同的函数和奇怪的泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6252875/