Considérons l'extrait de code suivant, je stumpled après remaniement, lors de notre arrivée, pourquoi le serveur de build signalé une fracture de la construire, mais il était très bien dans mon IDE:
List<String> text;
...
for (String text : text) {...}
Ainsi, le même nom est utilisé pour la Chaîne et la Liste dans la for-each.
Bien sûr ce n'est pas très sage de faire, mais après la suite de mon nosiness avant de le renommer, j'ai vu que le code ci-dessus compile bien avec JDK 8, mais donne l'erreur ci-dessous avec JDK 7:
error: for-each not applicable to expression type
for (String text : text) {
^
required: array or java.lang.Iterable
found: String
1 error
Je sais que des modifications ont été apportées à plusieurs parties dans cette région à l'intérieur de la JDK - mais quelqu'un peut-il m'éclairer sur le pourquoi de ce comportement se produit?
Mise à jour: Depuis que j'ai quelques commentaires à propos des comportements différents, voici un exemple complet de la classe:
import java.util.Arrays;
import java.util.List;
public class Strange {
List<String> text = Arrays.asList("Max", "Alex", "Maria");
public static void main(String[] args) {
new Strange().doSomething("Alex");
}
public void doSomething(String name) {
for (String text : text) {
System.out.println(text.equals("Alex"));
}
}
}
Et voici le processus de compilation et de sortie (Windows 7 64bit):
C:\copy>c:\Projects\java\jdk1.7.0_79\bin\javac.exe Strange.java
Strange.java:13: error: for-each not applicable to expression type
for (String text : text) {
^
required: array or java.lang.Iterable
found: String
1 error
C:\copy>c:\Projects\java\jdk1.8.0_60\bin\javac.exe Strange.java
C:\copy>
Conclusion: J'étais tellement perplexe pourquoi mon IDE (qui utilise 8) ne se plaignent pas deux fois le même nom dans une même instruction - mais maintenant, il est clair que ce n'est pas une instruction. Je me demande vraiment pourquoi ce point a été si longtemps en place si la JLS en dispose autrement. Mais de toute façon, merci pour les idées que j'ai reçus et les réponses grands (ce qui fait qu'il est difficile pour moi de prendre la meilleure).