以下代码片段(摘自真实代码)可以在Eclipse中编译和运行。
package1/Outer.java:
然而,使用javac编译时会出现以下错误:
现在,如果我改变导入语句的顺序,像这样:
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();
}
}
}
package2/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 package2.Bar;
import package1.Outer.Mid.Inner;
如果导入语句的顺序不正确,代码在Eclipse和javac中都会编译失败。那么为什么要注意导入语句的顺序呢?
注意事项:
- 我使用Java JDK 1.6.0_30和Java JDK 1.7.0_21进行了测试。如果此问题已得到修复,则最好知道。
- 奇怪的是,即使
Inner
接口嵌套在Outer.java中,package1.Outer.Mid.Inner
导入语句似乎也是必需的,但Eclipse和javac都需要它。 - 我发现这个问题是在尝试运行具有类似结构的生产代码的Ant构建时发现的。一切在Eclipse中都很好构建,但Ant脚本却无法通过。