La réponse est dans la spécification du langage Java, pas besoin de décompiler :) C'est ce que nous pouvons lire sur the enhanced for statement:
La version améliorée de déclaration a la forme :
EnhancedForStatement:
for (VariableModifiersopt Type Identifier: Expression) Statement
L'expression doit avoir le type Iterable
ou bien elle doit être de type tableau (§10.1) ou une erreur de compilation se produit.
La portée d'une variable locale déclarée dans la partie FormalParameter d'une instructionaméliorée for
(§14.14) est la déclaration contenue
La signification de la déclaration améliorée for
est donnée par la traduction en une déclaration for
de base.
Si le type de Expression
est un sous-type de Iterable
, puis laissez I
être le type de l'expression Expression.iterator()
. Le renforcement de déclaration for
est équivalente à une déclaration for
de base de la forme :
for (I #i = Expression.iterator(); #i.hasNext();) {
VariableModifiersopt Type Identifier = #i.next();
Statement
}
Lorsque #i
est un identificateur de compilateur généré qui est distincte de toute autres identificateurs (généré par le compilateur ou autrement) qui sont dans la portée (§6.3) au point où l'instruction améliorée pour se produit.
Dans le cas contraire, l'expression nécessairement a un type tableau, T[]
. Soit L1 ... Lm
soit le (éventuellement vide) de séquence étiquettes précédant immédiatement l'instruction améliorée for
. Alors le sens de l'amélioration de la déclaration est donnée par l'instruction de base for
suivante:
T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
VariableModifiersopt Type Identifier = a[i];
Statement
}
Où un et i sont des identifiants de compilateur généré qui sont distincts de tout autres identifiants ( généré par le compilateur ou autre) qui sont dans la portée au point où se produit l'instruction améliorée pour l'instruction .
(La syntaxe de la boucle enhanced for est un peu retour à l'avant.) –
Je ne sais pas si je serais d'accord pour appeler cette optimisation prématurée. Il est raisonnable de vouloir comprendre ce que le compilateur fait avec votre code. Nous ne savons pas non plus à quel moment dans son projet (s'il travaille même sur un projet et ne demande pas académiquement) il demande cela. Cela pourrait être à la toute fin. –
+1 pour la question. – user12458