_(アンダースコア)は予約済みのキーワードです


92

交換しました s次のラムダ式を次のようにました_

s -> Integer.parseInt(s)

Eclipseコンパイラは言う:

'_'は、ソースレベル1.8以降の予約キーワードであるため、識別子として使用しないでください。

JLS§3.9字句構造/キーワードには説明がありません。

回答:


83

見るべき場所はJLS§15.27.1です。ラムダパラメータ

ラムダパラメータの名前が_(つまり、1つのアンダースコア文字)の場合は、コンパイル時エラーです。

コンテキストで変数名_を使用することはお勧めしません。Javaプログラミング言語の将来のバージョンでは、この名前をキーワードとして予約したり、特別なセマンティクスを与えたりする可能性があります。

そのため、ラムダパラメータに対してエラーが生成されたとき、または他の_識別子に対して警告が生成されたとき、特に同じメッセージが両方の場合に使用されるため、Eclipseメッセージは誤解を招く可能性があります。


21
Java 9以降で_は、ラムダパラメータ名だけでなく、正当な識別子名としても許可されないことに注意してください。これは、実際には、ビルド43で修正されました:bugs.openjdk.java.net/browse/JDK-8061549
ジャン=フランソワ・Savard

3
@lscoughlin:「Javaプログラミング言語の将来のバージョンでは、この名前をキーワードとして予約したり、特別なセマンティクスを与えたりする」ステートメントでは不十分ですか?さて、「予約するかもしれません」を「使用する」に置き換えれば、画像が表示されます。たぶん、このメール参照が役立つ…
Holger

5
これは何ですか?Javaは下位互換性を壊していますか?
Arturo TorresSánchez15年

8
@Arturo TorresSánchez:それは新しいことではありません。そこ倍であったときenumassert法的な識別子は...だった
ホルガー

11
@Holgerには、アンダースコアを名前のプレースホルダーとして使用する言語がたくさんあります(ほんの数例を挙げると、Scala、Clojure、F#、SML、Erlang)。これは、90年代または80年代にまで遡る確立されたパターンだと思います。
om-nom-nom 2015

23

JEP 302のフェーズ2です。ラムダ式で未使用のパラメーターを示すために、アンダースコアを特殊文字として追加します。

アンダースコアの扱い

多くの言語では、アンダースコア(_)を使用して、名前のないラムダパラメーターを示します(メソッドおよび例外パラメーターの場合も同様)。

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

これにより、未使用の引数の静的チェックを強化でき、複数の引数を未使用としてマークすることもできます。ただし、アンダースコアはJava 8の時点で有効な識別子であったため、互換性のために、アンダースコアがJavaでこの役割を果たすことができる場所に到達するために、より間接的なパスを使用する必要がありました。フェーズ1では、アンダースコアをJava 8のラムダ仮パラメーター名として禁止し(以前はラムダが存在しなかったため、互換性への影響はありませんでした)、他の場所で識別子としてアンダースコアを使用することに対して警告が発行されました。この警告がエラーになったとき、フェーズ2はJava 9で登場しました。アンダースコアの計画されたリハビリを自由に完了して、未使用のラムダ、メソッド、またはキャッチの仮パラメーターを示すことができます。


1
この使用法については、Brian Goetz が2017-11年のプロジェクトアンバーに関するDevoxxの講演で話し合っています。
バジルブルク2018

OK、でもJ8で未使用のパラメータを表す代替手段は何ですか?それはまったく不可能ですか?
マヌエル、

1
現在$この目的で使用しています。
アベンチュリン

現在Java 14を使用していますが、名前のないラムダパラメーターとしてアンダースコアを使用することはできません。JCPが達成しようと試みたものは何でも、反対を達成したようです。
フランス

@Frans JEPは(現在のところ)候補者段階にあることに注意してください。まだ完成していません。JEPプロセスの詳細については、JEP 1
Alexandre de Champeaux

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.