次のコードがあります。
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;
質問:コードはコンパイルされますか?
回答:すべきですが、そうではありません
理由を説明してください。
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ビット