java - foreach 变量名等于字段名

标签 java foreach intellij-idea

在编译以下代码时发现了有趣的东西:

1    class A {
2        
3     private B line;
4   
5     public void foo() {
6       for (Integer line : line.getElements()) {
7    
8       }
9     }
10    }
11    
12    class B {
13    
14      List<Integer> getElements() {
15         return null; // doesn't matter
16      }
17    }

注意第6行:我们看到变量名等于字段名。 IntelliJ Idea 11 忽略了这一点,认为这里没有问题。但是java编译器告诉我'行没有方法getElements'。所以,两个问题:

  1. 我应该在 Idea 中提交错误报告吗?
  2. 为什么Java的错误信息是这样的?它不能检测错误吗?什么机制在这里起作用?场变量的食相?

最佳答案

这可能是您正在使用的 Java 编译器中的一个错误。根据Java Language Specification (section 14.14.2) ,增强的 for 语句中的变量范围是包含的语句。 (这似乎排除了 : 右侧的可迭代或数组表达式。)

您可以使用 this.line.getElements() 解决此问题。

编辑 只是为了好玩,我将此作为错误报告提交给 Sun。我们将看看 Java 工程师是否认为这是 JLS 或 javac 中的错误(或者他们是否有其他解释)。错误 ID 是 7139681 ,虽然它不会在几天内发布到外部数据库。

关于java - foreach 变量名等于字段名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9051879/

相关文章:

java - 调度程序 servlet 中的映射资源(Resin 服务器)

java - 让热代码替换正常工作(Eclipse EE juno、Jboss AS 7.1)

php - Foreach - 将 <li> </li> 包裹起来,里面有两个结果,然后重复。

javascript - 在 angular.forEach 循环中等待 promise

c# - 避免多次嵌套 For Each 循环

java - 两个独立项目之间的依赖关系的 Maven 问题

使用某些输入法时Java Frame无法关闭

android - Intellij IDEA 14 - 包 R 不存在

intellij-idea - 如何指示应先编辑a变量

java - 将 native sql 转换为未映射的对象