106 votes

_ (trait de soulignement) est un mot clé réservé

Je viens de remplacer s dans l'expression lambda suivante par _ :

s -> Integer.parseInt(s)

Le compilateur Eclipse dit :

'_' ne doit pas être utilisé comme identifiant, car il s'agit d'un mot-clé réservé à partir du niveau source 1.8.

Je n'ai pas trouvé d'explication dans le JLS §3.9 Structure lexicale / Mots-clés.

92voto

Holger Points 13789

L'endroit où il faut chercher est JLS §15.27.1. Paramètres lambda

C'est une erreur de compilation si un paramètre lambda porte le nom _ (c'est-à-dire un seul caractère de soulignement).

L'utilisation du nom de variable _ dans n'importe quel contexte est déconseillée. Les futures versions du langage de programmation Java pourront réserver ce nom comme mot-clé et/ou lui donner une sémantique particulière.

Le message d'Eclipse est donc trompeur, d'autant plus que le même message est utilisé dans les deux cas, lorsqu'une erreur est générée pour un paramètre lambda ou lorsqu'un avertissement est généré pour tout autre paramètre. _ identifiant.

27 votes

Notez qu'à partir de Java 9, _ sera interdit comme tout nom d'identifiant légal et pas seulement comme nom de paramètre lambda. Ce problème a été corrigé dans la version 43 : bugs.openjdk.java.net/browse/JDK-8061549

2 votes

Je ne trouve aucune référence quant à la raison.

4 votes

@lscoughlin : La déclaration "Les futures versions du langage de programmation Java peuvent réserver ce nom comme mot-clé et/ou lui donner une sémantique spéciale" n'est-elle pas suffisante ? Eh bien, remplacez "may reserve" par "will use", et vous comprendrez. Peut-être cette référence de courrier aide

36voto

Il s'agit de la phase 2 de JEP 302 qui va ajouter le caractère de soulignement comme caractère spécial pour désigner les paramètres inutilisés dans les expressions lambda.

Traitement des caractères de soulignement

Dans de nombreuses langues, il est courant d'utiliser un trait de soulignement ( _ ) pour désigner un paramètre lambda sans nom (et de la même manière pour les paramètres de méthode et d'exception) :

BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);

Cela permet une vérification statique plus forte des arguments inutilisés, et permet également de marquer plusieurs arguments comme inutilisés. Cependant, comme underscore est un identifiant valide depuis Java 8, la compatibilité nous a obligés à prendre un chemin plus indirect pour arriver à ce que underscore puisse jouer ce rôle dans Java. La phase 1 a consisté à interdire l'underscore comme nom de paramètre formel lambda dans Java 8 (cela n'a eu aucune conséquence sur la compatibilité, puisque les lambdas n'existaient pas auparavant) et un avertissement a été émis pour l'utilisation de l'underscore comme identifiant à d'autres endroits. La phase 2 est arrivée en Java 9, lorsque cet avertissement est devenu une erreur. Nous sommes maintenant libres d'achever la réhabilitation prévue de l'underscore pour indiquer un paramètre formel lambda, méthode ou catch non utilisé.

7voto

Angel Koh Points 697

Modifications du langage Java pour Java SE 9 https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD

À partir de Java 9, le caractère _ ne peut plus être utilisé comme identifiant, et pas seulement dans le contexte lambda.

Le caractère de soulignement n'est pas un nom légal.

Si vous utilisez le caractère de soulignement ("_") comme identifiant, votre code source ne peut plus être compilé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X