为什么这个代码用eclipse编译器编译但不用javac编译(maven)

Ümi*_*mit 8 java gwt compiler-errors gwt-platform

有很多像这样的问题.我经历了大部分但实际上没有,但我无法得出任何答案:

我的一个GWT/GWTP类中有一个奇怪的问题.
该类使用Eclipse编译器编译良好,但使用javac编译器(Maven)失败.

//additional imports
import com.gwtplatform.mvp.client.PresenterWidget;
import com.gwtplatform.mvp.client.View;

public class MyPresenter extends PresenterWidget<MyPresenter.MyView> {

    public interface MyView extends View {


    }

    some code
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用maven编译时,我收到以下错误:

找不到符号符号:class View

View是指包中的View接口com.gwtplatform.mvp.client.

我有其他类看起来一样,工作正常.
奇怪的是,如果我改变了导入的顺序,或者我指定了View接口的确切包,它在maven中编译时没有任何问题.
具体来说,我移动了导入com.gwtplatform.mvp.client.View

import com.gwtplatform.mvp.client.View;
//additional imports
import com.gwtplatform.mvp.client.PresenterWidget;
Run Code Online (Sandbox Code Playgroud)

前段时间我遇到了类似的问题,类之间的循环继承问题引用了内部类(在eclipse中工作但在javac中没有).但是我不确定这是否是同样的问题.

Edw*_*uck 9

Eclipse的编译器实际上是与javac编译器不同的编译器.有时他们在行为上分开,通常他们很快就会和解.

当Java的泛型出现时,这是非常值得注意的.有些情况下eclipse或者发现javac允许的泛型指令有错,或者javac发现eclipse允许的泛型错误(不记得它在很久以前分开的方式).在任何一种情况下,javac更可能是正确的实现.

在您的情况下,您使用泛型引用内部类来污染命名空间.可能的是,eclipse正以与javac不同的优先顺序到达"View".Javac实现了Java语言指南中指定的顺序,或者Java指南尚未宣布解决冲突的类似命名类的"一个真正的顺序",这种情况非常好.通常这不是问题,因为不允许在Java中使用相同的非完全限定名称两次; 但是,对于内部类,规范可以是"解决".

我会做的

public interface MyView extends View {


}
Run Code Online (Sandbox Code Playgroud)

绑定至一个视图(不知道com.gwtplatform.mvp.client.View或者MyPresenter.View是正确的),通过使名称明确.

public interface MyView extends MyPresenter.View {


}
Run Code Online (Sandbox Code Playgroud)

要么

public interface MyView extends com.gwtplatform.mvp.client.View {


}
Run Code Online (Sandbox Code Playgroud)

这样,您不会以依赖于编译器的方式成为"绑定"到错误类型的接口的受害者.