8

有一堆这样的问题。我经历了其中的大多数,但实际上都没有,但我想不出任何答案:

我的一个 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
}

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

找不到符号符号:类视图

视图是指包中的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;

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

4

1 回答 1

9

Eclipse 的编译器实际上是与 javac 编译器不同的编译器。有时他们在行为上分道扬镳,通常他们很快就和解了。

当 Java 的泛型问世时,这一点非常引人注目。在某些情况下,eclipse 发现 javac 允许的泛型指令有错误,或者 javac 发现 eclipse 允许的泛型指令有错误(不记得它以哪种方式分开,很久以前)。在任何一种情况下,javac 都更有可能是正确的实现。

在您的情况下,您使用对内部类的泛型引用污染了命名空间。奇怪的是,eclipse 以与 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 {


}

这样,您就不会以依赖于编译器的方式将接口“绑定”到错误的类型。

于 2012-01-19T15:48:16.370 回答