J'ai besoin d'un comparateur pour une goyave MultiSet.Entry, pour trier d'abord par comptage et ensuite par chaîne. Cependant, j'ai des problèmes de compilateur et je pense que je reçois quelque chose qui ne va pas avec les génériques.Comparateur pour MultiSet.Entry et Generics
Cette compile:
Comparator<Multiset.Entry<String>> comparator() {
return Comparator.comparing(Multiset.Entry::getCount);
}
Cependant, cela ne:
Comparator<Multiset.Entry<String>> comparator() {
return Comparator.comparing(Multiset.Entry::getCount).thenComparing(Multiset.Entry::getElement);
}
Error: java: incompatible types: cannot infer type-variable(s) T,U (argument mismatch; invalid method reference method getCount in interface com.google.common.collect.Multiset.Entry cannot be applied to given types required: no arguments found: java.lang.Object reason: actual and formal argument lists differ in length)
Si je combine Comparateurs par exemple pour un String, je n'ai évidemment pas de problème similaire. Qu'est-ce que je manque ici, et comment puis-je le faire fonctionner?
(Note: Je suis conscient qu'il pourrait y avoir des approches différentes avec goyave, mais je veux comprendre le problème que je reçois ici.)
Je ne prétends pas comprendre pourquoi c'est nécessaire, mais vous pouvez compiler ces chaînes 'thenComparing' en ajoutant des arguments de type explicites pour le premier appel de méthode. 'Comparateur., Integer> comparaison (Multiset.Entry :: getCount) .thenComparing (Multiset.Entry :: getElement);' –
Vous devez également utiliser comparisonInt() pour la première comparaison: 'return Comparator. < Multiset.Entry> comparisonInt (Multiset.Entry :: getCount) .thenComparing (Multiset.Entry :: getElement); ' –
comparaisonInt() a du sens, mais nécessite toujours un argument de type explicite. Pourquoi est-il nécessaire avec MultiSet.Entry, mais pas avec String? –