web-dev-qa-db-ja.com

単一のアンダースコア文字がラムダパラメーターの不正な名前であるのはなぜですか?

ラムダパラメーターに名前を付けてみました_、例: (縮小版):

Consumer<Object> c = _ -> {};

パラメータが無視されていることを示したかったのですが、次のコンパイラエラーが発生しました。

ラムダパラメーターの識別子としての「_」の使用は禁止されています

これは私にとって驚きでした。興味深いことに、twoアンダースコアはOKです:

Consumer<Object> c = __ -> {}; // no compile error

したがって、これは一般的にアンダースコア文字ではなく、単一の文字です。

単一アンダースコアの名前が特に禁止されているのはなぜですか?

22
Bohemian

理由は この投稿 から Brian Goetz 彼自身で表されます:

将来の言語機能で使用するために、識別子のスペースから「_」の構文上の領域を「再利用」しています。ただし、それを使用する可能性のある既存のプログラムがあるため、8の既存の構文位置で発生する識別子に対する警告であり、ラムダ形式のエラーです(ラムダを含む既存のコードがないため)。

30
Bohemian