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'interfacciaInner
è 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.
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
Qualche possibilità di eliminare le parti superflue del tuo codice e lasciarci con il minimo che produce ancora gli stessi strani risultati? – arshajii
@Gene Eclipse ha il proprio compilatore. – EJP