gpt4 book ai didi

java - 增强的 for 循环编译适用于 JDK 8 但不是 7

转载 作者:IT老高 更新时间:2023-10-28 21:03:37 25 4
gpt4 key购买 nike

考虑以下代码片段,在检查构建服务器报告构建损坏但在我的 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 中对这方面的几个部分进行了更改 - 但有人能告诉我为什么会发生这种行为吗?


更新:由于我收到了一些关于不同行为的评论,这里有一个完整的示例类:

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 另有规定,我真的很想知道为什么这一点已经存在了这么久。但无论如何,感谢我收到的见解和出色的答案(这让我很难选择最好的答案)。

最佳答案

对于 JDK 7 和 8,这实际上应该可以正常编译。

引用 JLS section 14.14.2 (Java 7 规范也是如此):

The enhanced for statement is equivalent to a basic for statement of the form:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
{VariableModifier} TargetType Identifier =
(TargetType) #i.next();
Statement
}

Iterator 重写增强的 for 循环

for (String text : text) {...}

变成

for (Iterator<String> it = text.iterator(); it.hasNext(); ) {
String text = it.next();
}

然后,引用 example 6.4.1 JLS:

A similar restriction on shadowing of members by local variables was judged impractical, because the addition of a member in a superclass could cause subclasses to have to rename local variables. Related considerations make restrictions on shadowing of local variables by members of nested classes, or on shadowing of local variables by local variables declared within nested classes unattractive as well.

因此,这里没有编译时错误,因为在使用局部变量遮蔽成员变量时没有任何限制,这里就是这种情况:局部变量 String text正在遮蔽成员变量 List<String> text .

关于java - 增强的 for 循环编译适用于 JDK 8 但不是 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33438842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com