je le code suivantlambdas génériques non applicable pour les arguments
public interface PredicateGeneric<T,Z>{
boolean compare(T t, Z z);
}
puis
PredicateGeneric<Integer,Integer> p= (Integer i, Integer j) -> i>=j;
et enfin
public static <T,Z> T getInt(Integer a, Integer b, PredicateGeneric<T,Z> p){
if(p.compare(a,b)==true){
return a;
}else{
return b;
}
}
la méthode est appelée par
System.out.println(getInt(4,5,p));
dans ma méthode principale.
Je reçois le message suivant dans Eclipse: "La méthode de comparaison (T, Z) dans le type PredicateGeneric est pas applicable pour les arguments (entiers, entiers)"
J'ai eu mes ennuis avec les génériques par le passé, je ne suis donc pas surpris d'avoir fait une erreur, mais je ne le trouve pas.
Voulez-vous dire 'p.compare (a, b) ...'? Pourquoi 'getInt' est-il générique? –
oui, je voulais dire p.compare (a, b). merci ok. Merci pour votre deuxième question ("Pourquoi getInt générique?") La méthode est seulement appelée getInt. et je l'ai utilisé pour expérimenter sur des expressions lambda. Vous soulevez une question parfaite et la méthode générique n'est vraiment pas très raisonnable. Correction en ajoutant/remplaçant les paramètres par des génériques et maintenant cela fonctionne comme je l'avais en tête – ikts
* Never * write '== true' n'importe où. Comme la partie gauche d'une telle comparaison doit être une expression 'boolean', utilisez simplement cette expression' boolean' sans détourner les expressions, c'est-à-dire 'if (p.compare (a, b)) ...'. Cependant, dans ce cas 'return p.compare (a, b)? a: b; 'est suffisant pour exprimer votre intention quand même. Et sachez qu'il y a déjà ['BiPredicate'] (https://docs.oracle.com/javase/8/docs/api/?java/util/function/BiPredicate.html) faisant exactement ce que votre 'PredicateGeneric ' est à propos. –
Holger