针对 JDK 8(但不是 7)的循环编译进行了增强
考虑以下代码片段,在经过一些重构后,我在签入时遇到了困难,为什么构建服务器报告构建损坏,但在我的IDE中很好:
List<String> text;
...
for (String text : text) {...}
因此,字符串和 for-each 中的 List 使用相同的名称。
这当然不是很明智,但是在重命名之前遵循了我的nosiness之后,我看到上面的代码在JDK 8中编译良好,但在JDK 7中给出了以下错误:
error: for-each not applicable to expression type
for (String text : text) {
^
required: array or java.lang.Iterable
found: String
1 error
我知道在JDK中对这一领域的几个部分进行了更改 - 但是有人可以启发我为什么会发生这种行为吗?
更新:由于我收到了一些关于不同行为的评论,这里有一个完整的示例类:
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"));
}
}
}
以下是编译过程和输出(Windows 7 64位):
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>
结论:我很困惑为什么我的IDE(使用8)没有在一个语句中抱怨两个相同的名称 - 但现在很明显它不是一个语句。我真的很想知道,如果JLS另有规定,为什么这一点已经存在了这么长时间。但无论如何,感谢我收到的见解和精彩的答案(这使我很难选择最好的答案)。