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

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

Mary-Kate Olsen
Libérer: 2024-12-03 14:51:14
original
408 Les gens l'ont consulté

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

Comparator.reversed() Incompatibilité avec les expressions Lambda

Lors de la tentative de tri d'une liste à l'aide d'expressions lambda et de la méthode reverse() de Comparator , une erreur de compilation se produit. Pour comprendre ce comportement, il est crucial d'approfondir les subtilités du mécanisme d'inférence de type du compilateur.

Le compilateur Java détermine le type de variables dans les expressions lambda en fonction du contexte dans lequel elles sont utilisées. Dans ce cas, la méthode de tri attend un argument de type Comparator. Lors de l'utilisation de références de méthode, le type de récepteur est déjà connu et l'argument lambda est déduit en conséquence. Par exemple :

userList.sort(Comparator.comparing(User::getName).reversed()); // works
Copier après la connexion

Cependant, lors de l'utilisation directe d'expressions lambda, le compilateur a du mal à déduire le type de la variable dans le lambda. Le type cible pour le lambda est Comparator, qui nécessite une fonction qui prend un utilisateur comme argument. Dans le code suivant, le lambda déduit correctement u en tant qu'utilisateur :

userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // works
Copier après la connexion

Cependant, en l'absence de références de méthode, le compilateur déduit par défaut le type de u en tant qu'objet, ce qui entraîne l'erreur de compilation :

userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error
Copier après la connexion

Pour résoudre ce problème, on peut soit utiliser des références de méthode si possible, soit spécifier explicitement le type de paramètre dans le lambda expression :

userList.sort(Comparator.comparing((User u) -> u.getName()).reversed()); // works
Copier après la connexion

Bien que cette limitation puisse être frustrante, elle est une conséquence du mécanisme d'inférence de type du compilateur. Les futures améliorations du compilateur pourraient résoudre ce problème.

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