J'ai eu le problème suivant: une méthode devrait prendre dans une bi-fonction qui prend 2 arguments - l'un est de type Collection<T>
et l'autre est T
; la fonction réelle pourrait être réellement Collection::remove
ou Collection::add
, ou une opération plus complexe; la fonction réelle est utilisée pour plus d'une douzaine de collection et il existe plusieurs types de valeurs et de collections dans la fonction.Est-ce possible de faire en utilisant simple BiFunction dans la définition de la méthode
Au départ, il n'y avait pas généricité - il n'y avait que Collection<String>
s et les éléments étaient String
s afin de déclarer l'argument que BiFunction<Collection<String>, String, Boolean>
fonctionnait très bien:
List<String> idCodes;
void visitElement(Element e,
BiFunction<Collection<String>, String, Boolean> elementOp) {
elementOp.apply(idCodes, e.getIdCode());
}
Cependant j'ajouté d'autres types de collections aussi, et a constaté que Je ne pouvais plus savoir comment utiliser BiFunction
génériquement:
List<String> idCodes;
List<Integer> weights;
void visitElement(Element e,
BiFunction<...> elementOp) {
elementOp.apply(idCodes, e.getIdCode());
elementOp.apply(weights, e.getWeight());
}
, mais a échoué - je pouvais obtenir des erreurs de compilation dans un endroit ou un autre, peu importe ce que j'utilise d pour les paramètres de type, il échouerait.
Un de mes tentatives était
<T> void visitElement(Element e,
BiFunction<Collection<T>, T, Boolean> elementOp)
échouerait pas lors du passage à Collection::add
mais lors de l'application en fait la fonction à Collection<String>
et String
; ou Collection<Integer>
et int
.
Ensuite, je fait une autre interface:
interface ElementOp {
<T> boolean apply(Collection<T> collection, T item);
}
Et pas surprenant cela fonctionne maintenant exactement comme je le voulais. Par conséquent, ma question est la suivante:
Dois-je vraiment utiliser
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());
}
ou serait-il possible d'utiliser une certaine façon BiFunction
pour ce cas?
P.S. J'utilise le compilateur Eclipse 4.3 Mars Java, il se peut donc que cela ne fonctionne pas à cause d'un bug.