【发布时间】:2016-01-31 01:08:22
【问题描述】:
考虑以下代码 sn-p,在检查构建服务器报告构建损坏但在我的 IDE 中很好的原因时,我在进行了一些重构后偶然发现:
List<String> text;
...
for (String text : text) {...}
因此,for-each 中的字符串和列表使用相同的名称。
这样做当然不是很明智,但是在重命名之前遵循我的多管闲事后,我看到上面的代码在 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 中对这方面的几个部分进行了更改 - 但有人能告诉我为什么会发生这种行为吗?
更新: 因为我得到了一些关于不同行为的 cmets,所以这里有一个完整的示例类:
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 另有规定,我真的很想知道为什么这一点已经存在了这么久。但无论如何,感谢我收到的见解和出色的答案(这让我很难选择最好的答案)。
【问题讨论】:
-
他不是在寻求解决方案,而是在寻求解释。这是一个有趣的行为,我也想知道
-
我怀疑 text 和 text 隐藏了同一个字段。 Java 8 可能对此更加放松,并意识到这是循环中的两个不同变量,但 Java 7 没有。您是否尝试重命名变量以使它们具有不同的名称?
-
@TheLaw:反之亦然,7 失败。当然,当使用不同的名称时,两者都有效。
-
@Mel:感谢您指出这一点 - 当然我通常不会做类似命名两者相同的事情 - 它只是偶然发生的,我只是在构建损坏后才意识到它并开始想知道.
-
我尝试使用 JDK 8 (1.8.0_31) 进行编译,但出现错误“变量文本已在方法中定义”
标签: java foreach java-8 java-7 language-lawyer