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
Barbara Streisandoriginal
2024-12-14 20:05:17734parcourir

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

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

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());

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

userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());

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!

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