为什么实用程序工厂方法经常使用特定的泛型参数(如T
)而不是有界通配符参数(如? super T
)?
例如,Functions#forPredicate的签名是:
public static <T> Function<T, Boolean> forPredicate(Predicate<T> predicate)
为什么不使用:
public static <T> Function<T, Boolean> forPredicate(Predicate<? super T> predicate)
哪个会使类似以下的事情成为可能?
Predicate<Number> isPositivePredicate = ...
Function<Integer, Boolean> isPositiveInteger = Functions.forPredicate(isPositivePredicate);
// above line is compiler error:
// Type mismatch: cannot convert from Function<Number,Boolean> to Function<Integer,Boolean>
是不是因为消费者Function
并且Predicate
被期望有必要的有界通配符参数来使这变得不必要?例如,Iterables#find上的通用边界将允许 aPredicate<Number>
用于 a Iterable<Integer>
:
public static <T> T find(Iterable<T> iterable,
Predicate<? super T> predicate)
还有其他原因吗?