Имеем следующий код:
Вопрос: скомпилируется ли код?
Ответ: должен, но не будет
А теперь объясняем почему.
Понятно, что в строке 6 происходит затемнение(eclipsing) поля класса переменной цикла. Но, по спецификации это не так! Самое смешное, что одна популярная платная IDE для Java ведет себя правильно, а компилятор жалуется, что getElements() отсутствует у line.
Читаем спецификацию:
Для тех, кому лень читать по-английски:
for ( VariableModifiersopt Type Identifier: Expression) Statement
Область видимости локальной переменной, объявляемой в Identifier, распространяется на Statement. Т.е. на Expression не распространяется.
Таким образом, затемнения поля здесь происходить не должно, но происходит. Засабмичен баг на эту тему под номером 7139681, но он появится в публичном доступе лишь через пару дней.
Будьте внимательны!
P.S. Я задал соответсвующий вопрос на SO, ждем обновлений.
P.P.S. Java 1.6.0.26 64bit
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 происходит затемнение(eclipsing) поля класса переменной цикла. Но, по спецификации это не так! Самое смешное, что одна популярная платная IDE для Java ведет себя правильно, а компилятор жалуется, что getElements() отсутствует у line.
Читаем спецификацию:
The enhanced for statement has the form:
EnhancedForStatement:
for ( VariableModifiersopt Type Identifier: Expression) Statement
The Expression must either have type Iterable or else it must be of an array type (§10.1), or a compile-time error occurs.
The scope of a local variable declared in the FormalParameter part of an enhanced for statement (§14.14) is the contained Statement
Для тех, кому лень читать по-английски:
for ( VariableModifiersopt Type Identifier: Expression) Statement
Область видимости локальной переменной, объявляемой в Identifier, распространяется на Statement. Т.е. на Expression не распространяется.
Таким образом, затемнения поля здесь происходить не должно, но происходит. Засабмичен баг на эту тему под номером 7139681, но он появится в публичном доступе лишь через пару дней.
Будьте внимательны!
P.S. Я задал соответсвующий вопрос на SO, ждем обновлений.
P.P.S. Java 1.6.0.26 64bit