_ (trattino basso) è una parola chiave riservata


92

Ho appena sostituito snella seguente espressione lambda da _:

s -> Integer.parseInt(s)

Il compilatore Eclipse dice:

"_" non deve essere utilizzato come identificatore, poiché è una parola chiave riservata dal livello di origine 1.8 in poi.

Non ho trovato alcuna spiegazione nella struttura lessicale / parole chiave JLS §3.9 .

Risposte:


83

Il posto dove cercare è JLS §15.27.1. Parametri Lambda

È un errore in fase di compilazione se un parametro lambda ha il nome _ (ovvero un singolo carattere di sottolineatura).

L'uso della variabile nome _ in qualsiasi contesto è sconsigliato. Le versioni future del linguaggio di programmazione Java potrebbero riservare questo nome come parola chiave e / o assegnargli una semantica speciale.

Quindi il messaggio Eclipse è fuorviante, soprattutto perché lo stesso messaggio viene utilizzato per entrambi i casi, quando viene generato un errore per un parametro lambda o quando viene generato un avviso per qualsiasi altro _identificatore.


21
Si noti che a partire da Java 9, _non sarà consentito come nomi di identificatori legali e non solo come nome di parametro lambda. Questo problema è
Jean-François Savard

3
@lscoughlin: Non è sufficiente la dichiarazione "Le versioni future del linguaggio di programmazione Java potrebbero riservare questo nome come parola chiave e / o dargli una semantica speciale"? Bene, sostituisci "può riservare" con "utilizzerà" e otterrai l'immagine. Forse questo riferimento alla posta aiuta ...
Holger

5
Cos'è questo? Java rompe la compatibilità con le versioni precedenti?
Arturo Torres Sánchez

8
@Arturo Torres Sánchez: non è una novità. Ci sono stati momenti in cui enumed asserterano identificatori legali ...
Holger

11
@Holger in realtà ci sono tonnellate di lingue che usano il carattere di sottolineatura come segnaposto del nome (Scala, Clojure, F #, SML, Erlang, solo per citarne alcuni). È uno schema consolidato che risale agli anni '90 o '80, credo, quindi disobbedire è strano.
om-nom-nom

23

È la fase 2 di JEP 302 , che aggiungerà un carattere di sottolineatura come carattere speciale per indicare i parametri inutilizzati nelle espressioni lambda.

Trattamento delle sottolineature

In molte lingue, è comune utilizzare un carattere di sottolineatura ( _) per denotare un parametro lambda senza nome (e in modo simile per i parametri di metodo ed eccezione):

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

Ciò consente un controllo statico più efficace degli argomenti inutilizzati e consente inoltre di contrassegnare più argomenti come non utilizzati. Tuttavia, poiché il carattere di sottolineatura era un identificatore valido a partire da Java 8, la compatibilità ci richiedeva di prendere un percorso più indiretto per arrivare al punto in cui il carattere di sottolineatura poteva svolgere questo ruolo in Java. La fase 1 proibiva il carattere di sottolineatura come nome di parametro formale lambda in Java 8 (ciò non ha avuto conseguenze sulla compatibilità, poiché lambda non esistevano in precedenza) ed è stato emesso un avviso per l'utilizzo del carattere di sottolineatura come identificatore in altre posizioni. La fase 2 è arrivata in Java 9, quando questo avviso è diventato un errore. Siamo ora liberi di completare la riabilitazione pianificata del carattere di sottolineatura per indicare un lambda, un metodo o un parametro formale non utilizzato.


1
Questo utilizzo è discusso da Brian Goetz nel suo discorso Devoxx del 2017-11 sul progetto Amber .
Basil Bourque

OK, ma qual è l'alternativa per indicare i parametri inutilizzati in J8? Non è affatto possibile?
Manuel

1
Attualmente utilizziamo $per questo scopo.
avventurina

Sono su Java 14 ora e non riesco ancora a utilizzare un trattino basso come parametro lambda senza nome. Qualunque cosa il JCP si proponesse di ottenere, sembra che abbiano ottenuto il contrario.
Frans

@Frans Notare che il PEC è (ad oggi) solo nella fase di candidato. Non è stato ancora completato. Per maggiori dettagli sul processo PEC, vedere JEP 1
Alexandre de Champeaux,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.