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>
これを不要にするために、との消費者が必要な限定されたワイルドカード パラメータを持つことが期待されているためですか? たとえば、Iterables#findの一般的な境界により、 a でaを使用できるようになります。Function
Predicate
Predicate<Number>
Iterable<Integer>
public static <T> T find(Iterable<T> iterable,
Predicate<? super T> predicate)
他の理由はありますか?