2016-05-21 1 views
0

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.

+1

Voulez-vous dire 'p.compare (a, b) ...'? Pourquoi 'getInt' est-il générique? –

+0

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

+0

* 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

Répondre

2

Modifier déclaration de type à:

public static <T,Z> T getInt(T a, Z b, PredicateGeneric<T,Z> p){ 
    if(p.compare(a,b)==true){ 
     return a; 
    }else{ 
     return b; 
    } 
} 

mais maintenant vous ne pouvez retourner a ou b parce que leurs types ne correspondent pas à la déclaration. Vous pouvez déclarer cette méthode avec à la fois a et b et renvoyer une valeur avec le même type ou penser à une valeur de retour différente.

+0

Bien sûr, vous pouvez faire en sorte que les deux types soient identiques, par ex. ' T getInt (T a, T b, PredicateGeneric p)' ou vous vous concentrez sur les valeurs int, comme le suggère le nom de la méthode, 'Integer getInt (Integer a, Integer b, PredicateGeneric p)' – Holger