Maison >Java >javaDidacticiel >Pourquoi `Comparator.reversed()` provoque-t-il des erreurs de compilation avec les expressions Java Lambda ?
Piège du compilateur : Comparator.reversed() et expressions Lambda
Les expressions Lambda fournissent un moyen concis de personnaliser le comportement de tri, mais lorsqu'elles sont utilisées avec Comparator.reversed(), une erreur de compilation survient. Cette erreur provient de l'incapacité du compilateur à déduire le type de cible correct pour le lambda.
Comprendre l'erreur
Considérez l'exemple de code suivant :
userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error
Dans ce cas, l'erreur se produit car le compilateur ne peut pas déterminer le type du paramètre u dans l'expression lambda. Pour déduire le type, le compilateur nécessite un type cible pour le lambda.
Normalement, le type cible est établi par le contexte dans lequel le lambda est utilisé. Dans la première ligne de l'extrait de code que vous avez fourni, le type cible est Comparator
Lambda vs. Method Reference
L'erreur se produit uniquement lors de l'utilisation d'une expression lambda. Lorsque vous utilisez une référence de méthode (comme dans la deuxième ligne de votre extrait de code), le type cible est explicitement fourni par la signature de la méthode, résolvant ainsi le problème d'inférence de type.
Résolution de l'erreur
Pour résoudre l'erreur lors de l'utilisation d'une expression lambda, vous pouvez fournir explicitement le type de paramètre :
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
Cela spécifie explicitement que vous êtes de tapez User, permettant au compilateur de déduire correctement le type cible.
Faiblesse du compilateur
L'erreur en question met en évidence une faiblesse dans le mécanisme d'inférence de type du compilateur. La raison précise pour laquelle la méthode reverse() perturbe le typage cible n’est pas claire. Les futures améliorations du compilateur pourraient résoudre ce problème, permettant d'utiliser des expressions lambda sans saisie explicite de paramètres.
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!