Je suis en train de créer une classe implémentant comparable. Lorsque tous les éléments de classe sont des nombres entiers, tout fonctionne bien. Quand je vais avec une ficelle et d' utiliser comparing
plutôt que comparingInt
, je reçois les erreurs suivantes.
nombre incorrect d'arguments de type générique pour la méthode de comparaison (Function) de type comparateur; il ne peut pas être paramétrés avec des arguments
Le type myClassdoes définissent pas GetFrom (T) qui est applicable ici
public class myClass implements Comparable<myClass> {
@Column (name="From")
private String from;
@Column (name="To")
private String to;
@Column (name="With")
private String with;
@Column (name="amount")
private int amount;
// Setters, getters, constructor
Comparator<myClass > comp = Comparator.<myClass>comparing(myClass::getFrom)
.thenComparing(myClass::getTo)
.thenComparing(myClass::getWith)
.thenComparingInt(myClass::getAmount);
@Override
public int compareTo(myClass o) {
return comp.compare(this, o);
}
}
Quelqu'un pourrait-il indiquer ce que je pourrais être absent ici?
Comparator :: on compare est une méthode générique qui prend une fonction qui est utilisée pour extraire la valeur à comparer. Vous avez passé une référence de méthode pour la myClass::getFrom
méthode qui retourne un String
et sera appelé sur myClass
objet de type (par Function::apply
). C'est pourquoi vous devez passer des types génériques myClass
et String
.
Cependant , vous pouvez ommettre ces types génériques parce que vous assignez votre comparateur de Comparator<myClass> comp
variable afin types peuvent être automatiquement insérées (également en utilisant des types de votre référence de méthode).
Vous cherchez le regard de plus déposons sur la Comparator::comparing(Function)
mise en œuvre de la méthode:
static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> var0) {
Objects.requireNonNull(var0);
return (Comparator)((Serializable)((var1x, var2x) -> {
return ((Comparable)var0.apply(var1x)).compareTo(var0.apply(var2x));
}));
}
Ici T
sera myClass
et U
sera String
. Fonction var0
prendra myClass
comme paramètre et retourne String
(si la méthode de référence à myClass::getFrom
volonté travail ici - en général ce sera comme l' invocation getFrom
sur l' myClass
objet). En fait , comme vous pouvez voir cette méthode renvoie une Comparator
en fonction lambda qui utilisera la fonction var0
des valeurs d'extrait de var1x
et var2x
( les deux d'entre eux seront myClass
types). Pour moi , il ressemble un peu à une fermeture.