Maison > Java > javaDidacticiel > Pourquoi l'inférence de type de comparateur Java 8 échoue-t-elle lors du chaînage des appels « thenComparing » ?

Pourquoi l'inférence de type de comparateur Java 8 échoue-t-elle lors du chaînage des appels « thenComparing » ?

Susan Sarandon
Libérer: 2024-11-28 12:53:11
original
414 Les gens l'ont consulté

Why Does Java 8 Comparator Type Inference Fail When Chaining `thenComparing` Calls?

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);
Copier après la connexion

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
Copier après la connexion

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)));
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal