Vla*_*nov 21 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 }
Run Code Online (Sandbox Code Playgroud)
注意第6行:我们看到变量名等于字段名.IntelliJ Idea 11忽略了这一点,并认为这里没有麻烦.但java编译器告诉我'line没有方法getElements'.那么,有两个问题:
Ted*_*opp 13
这可能是您正在使用的Java编译器中的错误.根据Java语言规范(第14.14.2节),增强for语句中变量的范围是包含的语句.(这似乎排除了右边的iterable或数组表达式:.)
您可以使用以解决此问题this.line.getElements().
编辑 只是为了踢,我把它作为一个错误报告提交给Sun. 我们将看看Java工程师是否认为它是JLS或javac中的错误(或者如果他们有其他解释).错误ID是7139681,虽然它不会在几天内发布到外部数据库.
如果使用与字段相同的名称声明局部变量(这是您所做的),则可以将字段变量作为this.name.
for (Integer line : this.line.getElements()) {
}
Run Code Online (Sandbox Code Playgroud)