なぜユーティリティファクトリメソッドは、(? super T
のような)ワイルドカードパラメータの代わりに特定の汎用パラメータ(T
など)を使用するのはなぜですか?例えばグアバでは、なぜ "?super T"が可能なところで "T"だけが使用されますか?
、Functions#forPredicateのシグネチャは次のとおりです。
public static <T> Function<T, Boolean> forPredicate(Predicate<T> predicate)
なぜ使用しない:
public static <T> Function<T, Boolean> forPredicate(Predicate<? super T> predicate)
を以下の可能性のようなものを作ることになりますか? 消費者Function
と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上の一般的な境界がPredicate<Number>
がIterable<Integer>
上で使用することができるようになる:
public static <T> T find(Iterable<T> iterable,
Predicate<? super T> predicate)
が他の理由はありますか?
re。最初のポイントは、消費者をキャストするだけで、2つの悪の悪いところです。また好奇心が強い、あなたが「我々」と言うときは、あなたがこのソフトウェアコミュニティで開発したのか、それとも一般的なソフトウェアコミュニティで開発したのかを意味します。 – djechlin
具体的には、この方針はどのように実践していますか?現時点では、私がそれが重要であると想像できる唯一の状況は、消費者は派生型へのキャスティングをバイパスするだけです。 – djechlin
私が「私たち」と言うとき、私はGuavaを開発するGoogle Java Core Librariesチームにいることを意味します。しかし、消費者は絶対にキャストする必要はありません: 'Predicate super T>'は 'Predicate'を使う場所であればいつでも直接使うことができます。キャストする必要はありません。正確に同じ値に適用することができます。 –