Comprendre l'erreur du compilateur dans Comparator.reversed() avec Lambdas
Lors de la tentative de tri d'une liste d'objets utilisateur à l'aide d'une expression lambda pour le comparateur, tel que :
List<User> userList = Arrays.asList(u1, u2, u3); userList.sort(Comparator.comparing(u -> u.getName()).reversed());
le compilateur peut afficher une erreur indiquant qu'il ne peut pas trouver le getName() dans la variable u de lambda. Ce problème provient d'une faiblesse dans le mécanisme d'inférence de type du compilateur.
Pour résoudre cette erreur, nous devons établir le type cible pour le lambda. Lors du tri à l'aide de Comparator.comparing(), le lambda doit prendre un argument du même type que les objets de la liste.
Dans la première ligne du code, où l'on utilise une référence de méthode, le type cible est déduit du type de paramètre de méthode, qui est User. Cela permet au compilateur de déduire correctement le type de u dans le lambda.
Cependant, dans la troisième ligne, où nous utilisons une expression lambda au lieu d'une référence de méthode, l'appel à reverse() perturbe le type cible. inférence. Le compilateur ne peut pas propager le type cible au récepteur, vous laissant avec un type d'objet déduit, qui n'a pas de méthode getName().
Pour résoudre ce problème, nous pouvons soit utiliser une référence de méthode, soit spécifiez explicitement le type de u dans le lambda, comme ceci :
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
Cela garantit que le compilateur peut déduire le type correct pour u dans le lambda et trier avec succès la liste en fonction le comparateur spécifié.
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!