プログラマの平日またはコンパイラのエラーのまれなケース

次のコードがあります。

1 class A { 2 3 private B line; 4 5 public void foo() { 6 for (Integer line : line.getElements()) { 7 8 } 9 } 10 } 11 12 class B { 13 14 List<Integer> getElements() { 15 return null; // doesn't matter 16 } 17 } 


質問:コードはコンパイルされますか?
回答:すべきですが、そうではありません



理由を説明してください。

6行目では、クラスフィールド変数のループが暗くなっています。 しかし、仕様によれば、これはそうではありません! 面白いのは、人気のあるJava用の有料IDEの1つが正しく動作し、コンパイラがgetElements()が行にないことを訴えていることです。

仕様を読む:

拡張forステートメントの形式は次のとおりです。

EnhancedForStatement:
for(VariableModifiersoptタイプID:式)ステートメント
式の型はIterableであるか、配列型(§10.1)である必要があります。そうでない場合、コンパイル時エラーが発生します。
拡張forステートメント(§14.14)の仮パラメーター部分で宣言されたローカル変数のスコープは、含まれるステートメントです


英語で読むのが面倒な人のために:

for(VariableModifiersoptタイプID:式)ステートメント



Identifierで宣言されたローカル変数のスコープは、Statementまで拡張されます。 つまり 式は適用されません。

したがって、フィールドの暗色化はここでは発生しませんが、発生します。 このトピックのバグは、番号7139681の下のzababmですが、パブリックドメインに表示されるのは数日後です。

注意してください!

PS私はSOで対応する質問をしました。更新を待っています。

PPS Java 1.6.0.26 64ビット

Source: https://habr.com/ru/post/J137243/


All Articles