2013-07-12 15 views
8

Il seguente frammento (estratto dal codice del mondo reale) viene compilato ed eseguito in Eclipse.Stringa differenza del compilatore tra Eclipse e javac

package1/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(); 
     } 
    } 

} 

Package2/Bar.java:

package package2; 

public interface Bar { 
    void bar(); 
} 

Tuttavia, non riesce con questo errore quando si compila utilizzando 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 

Ora , se cambio l'ordine delle istruzioni di importazione, in questo modo:

import package2.Bar; 
import package1.Outer.Mid.Inner; 

... quindi compila sia in Eclipse che in javac. Chiaramente l'ordine delle dichiarazioni di importazione sembra importare ... ma perché?

Note:

  • Ho provato questo utilizzando Java JDK 1.6.0_30, e anche Java JDK 1.7.0_21. Se questo è un bug che è stato corretto, sarebbe bene saperlo.
  • Sembra strano a me che l'importazione package1.Outer.Mid.Inner è ancora necessaria, dato l'interfaccia Inner è nidificato all'interno Outer.java, ma entrambi Eclipse e javac sembrano richiederlo
  • ho scoperto questo problema cercando di farlo una build Ant di codice di produzione che aveva una struttura simile. Tutto andava bene in Eclipse, ma lo script Ant si è appena rifiutato di passare.
+0

Non lo so per certo, ma è probabile che Eclipse stia dando un comando di compilazione diverso da quello che sei a mano. Forse l'ordine è invertito. L'unica altra possibilità sono le diverse versioni del compilatore java. – Gene

+3

Qualche possibilità di eliminare le parti superflue del tuo codice e lasciarci con il minimo che produce ancora gli stessi strani risultati? – arshajii

+0

@Gene Eclipse ha il proprio compilatore. – EJP

risposta

4

Questo sembra un bug, come riportato nella banca dati degli errori di Oracle here.

Secondo lo JLS §7.5, l'ordine degli import -statements non dovrebbe avere importanza.

+0

Il bug collegato è contrassegnato come corretto nella versione 1.6u1. – EJP

+0

@EJP Vedere l'aggiornamento – arshajii

+0

@arshaji il collegamento aggiornato sembra certamente corrispondere al mio caso, buona ricerca. Per il JLS, non vedo alcuna menzione esplicita che l'ordine delle istruzioni di importazione non abbia importanza ... è una comprensione implicita o sono solo cieco? –

Problemi correlati