Ответ находится в спецификации языка Java, декомпилировать не нужно :) Это то, что мы можем прочитать о расширенный оператор for:
Расширенный оператор for имеет вид:
EnhancedForStatement:
for ( VariableModifiersopt Type Identifier: Expression) Statement
Выражение должно иметь тип Iterable
или тип массива (§10.1), иначе возникнет ошибка времени компиляции.
Объем локальной переменной, объявленной в части FormalParameter расширенного оператора for
(§14.14), является содержащимся в нем оператором.
Значение расширенного оператора for
дается переводом в базовый оператор for
.
Если тип Expression
является подтипом Iterable
, тогда пусть I
будет типом выражения Expression. iterator()
. Расширенный оператор for
эквивалентен базовому оператору for
в форме:
for (I #i = Expression.iterator(); #i.hasNext(); ) {
VariableModifiersopt Type Identifier = #i.next();
Statement
}
Где #i
- идентификатор, сгенерированный компилятором, который отличается от любых других идентификаторов (генерируемых компилятором или иным образом), которые находятся в области действия (§6.3) в точке, где возникает расширенный оператор for.
В противном случае выражение обязательно имеет тип массива, T[]
. Пусть L1 ... Lm
будет (возможно, пустой) последовательностью меток, непосредственно предшествующей расширенному оператору for
. Тогда значение расширенного оператора for задается следующим основным оператором for
:
T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
VariableModifiersopt Type Identifier = a[i];
Statement
}
Где a и i - идентификаторы, сгенерированные компилятором, которые отличаются от любых других идентификаторов (сгенерированных компилятором или иным образом), которые находятся в области действия в точке, где возникает расширенный оператор for. .