私は以下の問題を抱えていました。メソッドは2つの引数を取る2関数をとるべきです - 1種類はCollection<T>
、もう1つはT
です。実際の関数は実際にはCollection::remove
またはCollection::add
になるか、より複雑な操作になります。実際の関数は1ダース以上のコレクションに使用され、関数にはいくつかの型の値とコレクションがあります。これは、メソッド定義でプレーンBiFunctionを使用することは可能ですか?
には、最初は汎用性がなかった - ちょうどCollection<String>
sがあったと要素がBiFunction<Collection<String>, String, Boolean>
がちょうどよく働いてString
sがそう引数を宣言した:
List<String> idCodes;
void visitElement(Element e,
BiFunction<Collection<String>, String, Boolean> elementOp) {
elementOp.apply(idCodes, e.getIdCode());
}
をしかし、私はあまりにもコレクションの他のタイプを追加し、発見しました
List<String> idCodes;
List<Integer> weights;
void visitElement(Element e,
BiFunction<...> elementOp) {
elementOp.apply(idCodes, e.getIdCode());
elementOp.apply(weights, e.getWeight());
}
をしかし失敗しました - 私はちょうどかかわらず、私が使用しているもの一つの場所または別のコンパイルエラーを取得することができなかった:私はもはや一般的にBiFunction
を使用する方法を見つけることができませんでした型パラメータの場合はdが失敗します。
私の試みの一つは、Collection::add
を渡すときには、実際にCollection<String>
とString
に関数を適用するとき
<T> void visitElement(Element e,
BiFunction<Collection<T>, T, Boolean> elementOp)
がない失敗しました。またはCollection<Integer>
およびint
である。
は、それから私は別のインターフェイスを作った:
interface ElementOp {
<T> boolean apply(Collection<T> collection, T item);
}
そしてませんので、驚くこと、これは今、私が望んでいたとおりに動作します。したがって、私の質問は:
は、私は本当に
interface ElementOp {
<T> boolean apply(Collection<T> collection, T item);
}
void visitElement(Element e,
ElementOp elementOp) {
elementOp.apply(idCodes, e.getIdCode());
elementOp.apply(weights, e.getWeight());
}
を使用しなければならないのか、この場合のためにBiFunction
を使用することが何とか可能でしょうか?
P.S.私はEclipse 4.3 Mars Javaコンパイラを使用していますので、そこにあるバグのために動作しないかもしれません。