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
Susan Sarandonoriginal
2024-11-28 12:53:11435parcourir

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);

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!

Déclaration:
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