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
Mary-Kate Olsenoriginal
2024-12-03 14:51:14435parcourir

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

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

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

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

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!

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