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

次のコードがあります。



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ビット



All Articles