为什么这段代码用eclipse编译器编译但不用javac(maven)编译
有很多像这样的问题。 我经历了大部分但实际上没有,但我无法得出任何答案:
我的一个GWT / GWTP类中有一个奇怪的问题。
该类使用Eclipse编译器编译良好,但使用javac编译器(Maven)失败。
//additional imports import com.gwtplatform.mvp.client.PresenterWidget; import com.gwtplatform.mvp.client.View; public class MyPresenter extends PresenterWidget { public interface MyView extends View { } some code }
当我尝试使用maven编译时,我收到以下错误:
找不到符号符号:class View
View是指com.gwtplatform.mvp.client
包中的View
界面。
我有其他类看起来一样,工作正常。
奇怪的是,如果我改变了导入的顺序,或者我指定了View
接口的确切包,它在maven中编译时没有任何问题。
具体来说,我移动了com.gwtplatform.mvp.client.View
的导入
import com.gwtplatform.mvp.client.View; //additional imports import com.gwtplatform.mvp.client.PresenterWidget;
前段时间我有类似的问题,类之间的循环inheritance问题引用了内部类(在eclipse中工作但在javac中没有)。 但是我不确定这是否是同样的问题。
Eclipse的编译器实际上是一个与javac编译器不同的编译器。 有时他们在行为上分开,通常他们很快就会和解。
当Java的generics出现时,这是非常值得注意的。 有些情况下eclipse或者发现了javac允许的generics指令的错误,或者javac发现eclipse允许的generics错误(不记得它在很久以前分开的方式)。 在任何一种情况下,javac都更可能是正确的实现。
在您的情况下,您使用generics引用内部类来污染命名空间。 可能的是,日食以不同于javac的优先顺序到达“视图”。 Javac实现了Java语言指南中指定的顺序,或者Java指南尚未宣布解决冲突的类似命名类的“一个真正的顺序”,这种情况非常好。 通常这不是问题,因为不允许在Java中使用相同的非完全限定名称两次; 但是,对于内部类,规范可以是“解决”的类型。
我会做的
public interface MyView extends View { }
通过使名称显式绑定到一个视图(不知道com.gwtplatform.mvp.client.View
或MyPresenter.View
是否正确)。
public interface MyView extends MyPresenter.View { }
要么
public interface MyView extends com.gwtplatform.mvp.client.View { }
这样,您不会以依赖于编译器的方式成为“绑定”到错误类型的接口的受害者。