增强了对JDK 8而不是7的循环编译的精度

亚历山大·吕尔

考虑一下以下代码片段,在进行重构后,我检查了为什么构建服务器报告了一个已损坏的构建,但在我的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另有说明,为什么这一点已经存在很长时间了。但是无论如何,感谢我所获得的见解和出色的回答(这使我很难选出最好的答案)。

霍尔格

虽然推理(使用从增强for循环到传统for循环的指定转换,并由其他 答案使用)是正确的,但是有一个关于范围的明确说明:

§6.3。声明范围

增强型语句(第14.24.2节FormalParameter部分中声明的局部变量的范围是所包含的Statementfor

直接链接

因此,变量的范围不包括增强循环表达式for

Java 7Java 6相比,您可以验证它没有改变,尽管两者(我尝试过Java 6 javac)都表现出矛盾的行为。

因此,编译器行为的这一变化是一个旧错误的修复……

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

增强了循环空检查优化

来自分类Dev

Dojo增强了Java中的网格分页

来自分类Dev

如何检测jQuery Mobile是否增强了控件?

来自分类Dev

SOLR完全匹配增强了包含完全匹配的文本

来自分类Dev

增强for循环如何增强?

来自分类Dev

增强的for循环

来自分类Dev

通过降低关联性增强了Skylake L2缓存?

来自分类Dev

使用Firebase捆绑包通过GTM v5增强了电子商务标签

来自分类Dev

WinRT增强了将收藏项添加到列表的性能

来自分类Dev

ggplot2的分类数据-灰度/ BW主题,增强了可读性

来自分类Dev

Maven:使用JDK8编译Java 7

来自分类Dev

增强矩阵,无循环

来自分类Dev

增强的for循环弦乐

来自分类Dev

增强的For循环查询

来自分类Dev

增强的 For 循环 Java

来自分类Dev

JDK8编译缓慢

来自分类Dev

JDK8编译缓慢

来自分类Dev

增强多精度舍入模式

来自分类Dev

增强多精度舍入模式

来自分类Dev

编译失败的JDK 11和编译罚款JDK 8

来自分类Dev

使用JDK 7与使用符合编译器兼容级别1.7的JDK 8有什么区别?

来自分类Dev

增强循环抛出IndexOutOfBounds异常

来自分类Dev

在增强for循环中重复迭代

来自分类Dev

具有增强的for循环的ClassCastException

来自分类Dev

创建我自己的增强的for循环

来自分类Dev

增强的for循环通过NullPointerException停止

来自分类Dev

增强for循环中的android反射

来自分类Dev

创建我自己的增强的for循环

来自分类Dev

增强的for循环通过NullPointerException停止