Supposons que je souhaite écrire une méthode buildBiFxnWithSameTypeArgs
, qui produise un argument à deux arguments BiFunction
dont les arguments d'entrée sont du même type. Il n'est pas connu à l'avance (c'est-à-dire quand buildBiFxnWithSameTypeArgs
est invoqué) spécifiquement quel type est - je veux juste que le compilateur applique que lorsque la fonction renvoyée par buildBiFxnWithSameTypeArgs
est invoquée, les types d'arguments qui lui sont fournis doivent correspondre. L'effet final devrait être, essentiellement, l'équivalent lambda de l'utilisation du même paramètre de type générique pour le type de deux arguments dans une définition de méthode.Retour d'une fonction lambda avec des types de paramètres contraints par des paramètres de type générique
Ma première tentative se présente comme suit:
public interface ConstrainedBiFunction<I, O> extends BiFunction<I, I, O> {}
public static ConstrainedBiFunction<?, String> buildBiFxnWithSameTypeArgs() {
return (inputOne, inputTwo) -> String.valueOf(inputOne) + String.valueOf(inputTwo);
}
public void test() {
buildBiFxnWithSameTypeArgs().apply(Integer.valueOf(1), Integer.valueOf(2));
}
Il semble, cependant, que le paramètre de type générique ?
ne peut pas être utilisé de cette façon; compilation échoue sur l'étape apply
avec l'erreur suivante:
apply (capture<?>, capture<?> in BiFunction cannot be applied to (java.lang.Integer, java.lang.Integer)
Est-il possible de retourner une fonction lambda dont les types de paramètres sont inférées, puis contraint par rapport à l'autre de cette façon?
EDIT: Excuses pour la question pas très bonne; J'avais un problème plus complexe dont j'essayais de capturer l'essence pour poser la question la plus simple possible, mais il semble que j'ai trop simplifié le problème. Je suis conscient, bien sûr, que toutes les classes héritent de Object
, donc dans cette interprétation trop simplifiée du problème, les solutions proposées par @shmosel et @JB Nizet fonctionnent. Je posterai une nouvelle question une fois que j'ai fait un meilleur travail en distillant le problème original.
Comment pensez-vous que '' ConstrainedBiFunction , String> concerne '.Appliquer (Integer.valueOf (1), Integer.valueOf (2));'? – Savior
Toutes les classes finissent par hériter de Object, donc même si vous passez, par exemple, un Banana et un Truck, le compilateur l'interprétera comme un objet ConstrainedBuFunction