在编译以下代码时发现了有趣的东西:
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'。所以,两个问题:
- 我应该在 Idea 中提交错误报告吗?
- 为什么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/