考虑一下以下代码片段,在进行重构后,我检查了为什么构建服务器报告了一个已损坏的构建,但在我的IDE中还不错:
List<String> text;
...
for (String text : text) {...}
因此,相同的名称用于for-each中的String和List。
这当然不是很明智,但是在重命名之前遵循了我的烦恼之后,我发现上面的代码可以在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 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>
结论:我很困惑,为什么我的IDE(使用8)没有在一个语句中抱怨两次相同的名称-但是现在很明显,它不是一个语句。我真的想知道,如果JLS另有说明,为什么这一点已经存在很长时间了。但是无论如何,感谢我所获得的见解和出色的回答(这使我很难选出最好的答案)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句