以下代码段(从实际代码中抽象出来)在
Eclipse中编译和运行.
包1 / Outer.java:
package package1;
import package1.Outer.Mid.Inner;
import package2.Bar;
public class Outer {
final Mid mid = new Mid();
public Outer() {
mid.setInner(new Inner() {
@Override public void foo() {
System.out.println("In Outer.foo()");
}
});
}
public static class Mid implements Bar {
private Inner inner;
public void setInner(Inner inner) {
this.inner = inner;
}
public Inner getInner() {
return this.inner;
}
@Override
public void bar() {}
interface Inner {
void foo();
}
}
}
包2 / Bar.java:
package package2;
public interface Bar {
void bar();
}
但是,使用javac进行编译时失败并出现此错误:
package1\Outer.java:31: cannot find symbol
symbol : class Bar
location: class package1.Outer
public static class Mid implements Bar {
^
package1\Outer.java:42: method does not override or implement a method from a supertype
@Override
^
2 errors
现在,如果我切换import语句的顺序,如下:
import package2.Bar;
import package1.Outer.Mid.Inner;
…然后它在Eclipse和javac中编译.很明显,导入语句的顺序似乎很重要……但为什么呢?
笔记:
>我使用Java JDK 1.6.0_30以及Java JDK 1.7.0_21对此进行了测试.如果这是一个已修复的错误,那将是很好的知道.
>对我来说,似乎很奇怪package1.Outer.Mid.Inner导入甚至是必要的,因为Inner接口嵌套在Outer.java中,但是Eclipse和javac似乎都需要它
>我发现这个问题试图运行具有类似结构的生产代码的Ant构建.在Eclipse中一切都很好,但Ant脚本却拒绝通过.