Maison > Java > javaDidacticiel > Pourquoi « Comparator.reversed() » de Java 8 provoque-t-il des conflits d'inférence de type avec les expressions Lambda ?

Pourquoi « Comparator.reversed() » de Java 8 provoque-t-il des conflits d'inférence de type avec les expressions Lambda ?

Barbara Streisand
Libérer: 2024-12-14 20:05:17
original
733 Les gens l'ont consulté

Why Does Java 8's `Comparator.reversed()` Cause Type Inference Conflicts with Lambda Expressions?

Les conflits d'inférence de types entravent les comparateurs Lambda inversés

Malgré son utilisation généralisée, la méthode Comparator.reversed() de Java 8 pose un obstacle à la compilation lorsqu'elle est combinée avec des expressions lambda, conduisant à l'erreur suivante :

com\java8\collectionapi\CollectionTest.java:35: error: cannot find symbol
            userList.sort(Comparator.comparing(u -> u.getName()).reversed());
                                                     ^
symbol:   method getName()
location: variable u of type Object
1 error
Copier après la connexion

Ce problème découle d'une limitation dans le mécanisme d'inférence de type du compilateur. Lorsqu'une expression lambda est utilisée avec Comparator.comparing(), elle nécessite un type cible pour déduire le type du paramètre. Dans le premier exemple, u est déterminé comme étant de type User en raison du type de cible suivant :

Comparator.comparing() -> Function<User, User.getName()> -> User
Copier après la connexion

Cependant, lorsque reverse() est introduit, le type de cible est perturbé et le compilateur ne peut plus déduire le type correct.

Pour résoudre ce problème, on peut recourir à des références de méthode, qui fournissent un type supplémentaire information :

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

Alternativement, un type de paramètre explicite peut être spécifié dans le lambda :

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

Il reste à voir si les futures améliorations du compilateur résoudront cet obstacle d'inférence de type.

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