2013-07-12 11 views
8

以下のスニペット(現実のコードから抽象化)は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スクリプトはただの処理を拒否しました。
+0

私は確かに分かりませんが、Eclipseは手作業とは異なるコンパイルコマンドを与えている可能性が高いです。おそらく順序は逆転しているでしょう。唯一の可能性は、javaコンパイラの異なるバージョンです。 – Gene

+3

あなたのコードの余分な部分を削除し、同じ奇妙な結果を生み出す最小限のものを残す可能性はありますか? – arshajii

+0

@Gene Eclipseには独自のコンパイラがあります。 – EJP

答えて

4

Oracleのバグデータベースhereで報告されているように、これはバグのようです。

JLS §7.5によれば、importの文の順序は重要ではありません。

+0

リンクされたバグは、リリース1.6u1で修正済みとしてマークされています。 – EJP

+0

@EJPアップデートを参照してください – arshajii

+0

@arshaji更新されたリンクは確かに私の場合、良い見つけると一致するように見えます。 JLSについては、import文の順序は重要ではないという明示的な言及はありません。暗黙の理解か、私はまったく盲目ですか? –

関連する問題