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!