Frage _ (Unterstrich) ist ein reserviertes Schlüsselwort


Ich habe gerade ersetzt s im folgenden Lambda-Ausdruck von _:

s -> Integer.parseInt(s)

Eclipse-Compiler sagt:

'_' sollte nicht als Bezeichner verwendet werden, da es sich um ein reserviertes Schlüsselwort ab Quellenniveau 1.8 handelt.

Ich habe keine Erklärung in der gefunden JLS §3.9 Lexikalische Struktur / Schlüsselwörter.


75
2018-05-07 17:02


Ursprung


Antworten:


Der Ort zum Schauen ist JLS §15.27.1. Lambda Parameter

Es ist ein Fehler bei der Kompilierung, wenn ein Lambda-Parameter den Namen _ hat (dh ein einzelner Unterstrich).

Von der Verwendung des Variablennamens _ in jedem Kontext wird abgeraten. Zukünftige Versionen der Java-Programmiersprache können diesen Namen als Schlüsselwort reservieren und / oder ihm eine spezielle Semantik geben.   

Daher ist die Eclipse-Nachricht irreführend, zumal die gleiche Nachricht für beide Fälle verwendet wird, wenn ein Fehler für einen Lambda-Parameter generiert wird oder wenn für einen anderen eine Warnung generiert wird _ Kennung.


76
2018-05-07 18:25



Java-Sprachänderungen für Java SE 9 https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD 

Ab Java 9 kann das Zeichen _ nicht mehr als Bezeichner verwendet werden, nicht nur im Lambda-Kontext

Der Unterstrich ist kein offizieller Name.

Wenn Sie den Unterstrich ("_") als Kennung verwenden, kann Ihr Quellcode nicht mehr übersetzt werden.


5
2017-09-27 11:48



Es ist die Phase 2 von JEP 302, das wird einen Unterstrich als Sonderzeichen hinzufügen, um unbenutzte Parameter in Lambda-Ausdrücken zu kennzeichnen.

Behandlung von Unterstrichen

In vielen Sprachen ist es üblich, einen Unterstrich zu verwenden (_) um einen unbenannten Lambda-Parameter (und ähnlich für Methoden- und Ausnahmeparameter) zu bezeichnen:

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

Dies ermöglicht eine stärkere statische Überprüfung von nicht verwendeten Argumenten und erlaubt es auch, mehrere Argumente als unbenutzt zu markieren. Da es sich bei Unterstreichung jedoch um eine gültige Kennung von Java 8 handelte, mussten wir aufgrund der Kompatibilität einen indirekteren Weg einschlagen, um zu erreichen, wo Unterstriche diese Rolle in Java erfüllen könnten. Phase 1 untersagte Unterstreichung als formalen Lambda-Parameternamen in Java 8 (dies hatte keine Kompatibilitätskonsequenz, da Lambdas vorher nicht existierten) und eine Warnung wurde ausgegeben, um Unterstriche als Bezeichner an anderen Stellen zu verwenden. Phase 2 kam in Java 9, als diese Warnung zu einem Fehler wurde. Es steht uns nun frei, die geplante Wiederherstellung des Unterstrichs abzuschließen, um einen nicht verwendeten Lambda, Methode oder Fangparameter anzugeben.


1
2017-07-09 22:34