【问题标题】:foreach with variable name equal to field nameforeach 变量名等于字段名
【发布时间】:2012-02-21 12:56:31
【问题描述】:

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

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 的错误消息是这样的?它不能检测错误吗?什么机制在这里起作用?场变量的食相?

【问题讨论】:

  • IntelliJ Idea 的行为应该与 javac 编译器一致。

标签: java foreach intellij-idea


【解决方案1】:

如果您声明与字段同名的局部变量(这是您所做的),那么您可以以this.name 访问字段变量。

for (Integer line : this.line.getElements()) {
}

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

  • @Tedd:你能详细说明“包含的声明”吗?
  • 我不确定规范是否这么说。 “在增强的 for 语句(第 14.14 节)的 FormalParameter 部分中声明的局部变量的范围是包含的语句” - 问题:AFAICT 的增强中没有“FormalParameter”部分。
  • @Mat,规格这么说,我也很困惑。
  • @thinksteep - 包含的语句是在 for 条件的控制下执行 0 次或多次的语句。 (括号部分之后的for 语句部分;通常在大括号{} 内的部分。)
  • @Mat - 我同意;规范似乎在这里写得不好(这有点令人惊讶)。 try 语句的 FormalParameter 部分(在 catch 子句 - 第 14.20 节中)似乎与增强的 for 语句中冒号之前的部分具有相同的语法。也许规范中的术语来自那里。
【解决方案3】:

当您使用 IntelliJ 时,它会自动解析所有文件。但是对于javac,它可能无法编译所有程序,尤其是之前已经编译过的程序。

假设您有 B 类(没有 getElements())并编译它。后来你添加方法只编译A,它会抱怨B没有那个方法,因为你上次编译的时候没有那个方法。

解决这个问题的方法是在编译或使用 maven 等构建工具之前删除所有 *.class 文件。

【讨论】:

  • 并非如此。我做了干净的整体重建。没有效果。
  • 这与OP的问题没有任何关系。问题可以归结为一个类:public class Bug { int[] index; public void bug() { for (int index : index) { } } }
  • 不清楚是不是代码错误。 JLS 和 javac 的行为之间存在不一致。在严格阅读 JLS 的情况下,代码应该是合法的。 (但是,JLS 的第 14.14.2 节似乎写得有些糟糕;它使用了一个似乎没有定义的术语,至少没有定义。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多