以下のスニペット(現実のコードから抽象化)はEclipseでコンパイルして実行します。Eclipseとjavacの奇妙なコンパイラの違い
パッケージ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ます。javacを使ってコンパイルするとき
package package2;
public interface Bar {
void bar();
}
はしかし、それはこのエラーで失敗します。
今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を使用して、これをテストしました。これが修正されているバグであれば、それは知っていると良いでしょう。
package1.Outer.Mid.Inner
インポートがInner
インタフェースがOuter.java内にネストされて与えられた、でも必要であると私には奇妙に思えるが、Eclipseとjavacの両方が、私はAntのビルドを実行しようと、この問題を発見し、それを- を必要としているように見えます同様の構造を持つ生産コード。 Eclipseではすべてがうまく構築されていましたが、Antスクリプトはただの処理を拒否しました。
私は確かに分かりませんが、Eclipseは手作業とは異なるコンパイルコマンドを与えている可能性が高いです。おそらく順序は逆転しているでしょう。唯一の可能性は、javaコンパイラの異なるバージョンです。 – Gene
あなたのコードの余分な部分を削除し、同じ奇妙な結果を生み出す最小限のものを残す可能性はありますか? – arshajii
@Gene Eclipseには独自のコンパイラがあります。 – EJP