Maison >Java >javaDidacticiel >Pourquoi `Comparator.reversed()` provoque-t-il des erreurs de compilation avec les expressions Java Lambda ?

Pourquoi `Comparator.reversed()` provoque-t-il des erreurs de compilation avec les expressions Java Lambda ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-15 06:22:11193parcourir

Why Does `Comparator.reversed()` Cause Compilation Errors with Java Lambda Expressions?

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, puisque userList.sort() attend un argument de ce type. Cela implique que vous êtes de type User, permettant au code de se compiler.

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!

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