Confusion d'inférence de type de comparateur Java 8
Java 8 a introduit des améliorations dans l'utilisation du comparateur via des expressions lambda. Cependant, lors du chaînage de plusieurs appels thenComparing, l’inférence de type peut devenir floue. Ce problème vient du fait que les expressions lambda manquent d'inférence de type en tant qu'expressions de récepteur de méthode.
Chaînage de comparateurs et inférence de type
Considérez le code suivant :
Comparator<String> c1 = Comparator.comparing(String::length); Comparator<String> c2 = c1.thenComparing(String::compareToIgnoreCase);
La première ligne utilise une référence de méthode sans paramètres de type, qui déclenche l'inférence de type basée sur le type de retour de String::length. Ce type est utilisé pour déduire le type de p1 dans la méthode thenComparing.
Cependant, dans une situation comme celle-ci :
Collections.sort(list, c1.thenComparing(String::compareToIgnoreCase)); // Error: cannot resolve method
L'inférence de type échoue car la méthode Collections.sort manque de type spécifique informations pour c1. Pour résoudre ce problème, nous pouvons fournir des paramètres de type explicites :
Collections.sort(list, c1.thenComparing(Comparator.comparing(String::compareToIgnoreCase)));
Tri des listes et des collections
Dans List.sort, l'inférence de type est effectuée différemment. Considérez :
list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase)); // No error
Ici, l'inférence de type n'est pas requise car le comparateur est créé directement dans la méthode de tri, fournissant les informations de type nécessaires. Cependant, cela ne vaut que pour le premier appel thenComparing. Les appels ultérieurs sans paramètres de type explicites entraîneront des erreurs.
Erreurs spécifiques à Eclipse
Il est important de noter que les erreurs que vous avez rencontrées peuvent être spécifiques à Eclipse. La compilation du code avec le compilateur javac JDK 8 résout souvent ces problèmes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!