为什么这段代码可以在Eclipse编译器中编译,但不能在Javac(Maven)中编译?

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

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;

我曾经遇到过一个类似的问题,涉及到引用内部类的类之间的循环继承问题(在eclipse中可以工作但在javac中则不行)。不过我不确定这是否是同样的问题。


1
不确定你问题的根本原因,但内部接口并不美观,可能会导致依赖项的来源混淆。 - AndyT
你是对的,我认为将接口移出类可能会解决它(虽然我还没有验证过)。我只是好奇这种奇怪行为的解释是什么(移动导入语句会导致代码编译或不编译)。 - Ümit
1个回答

9
Eclipse的编译器实际上是与javac编译器不同的编译器。有时它们的行为会有所不同,通常它们很快就会得到调和。
这在Java泛型出现时非常明显。有些情况下,eclipse会找到一个泛型指令的问题,而javac则允许它,或者javac会发现eclipse允许的泛型存在问题(无法记住两者是如何分离的,太久以前的事了)。无论哪种情况,javac更有可能是正确的实现方式。
在您的情况下,您使用泛型引用内部类污染了名称空间。很可能eclipse在查找“View”时使用的优先级顺序与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 {


}

那样你就不会成为编译器依赖方式下接口“绑定”错误类型的受害者。

哇,我在将一个Java项目从“什么也没有-只需在Eclipse中编译”转换为Maven的过程中遇到了问题。Java编译器抱怨缺少一个未丢失的符号,因此找到这个问题的原因很棘手。在外部类中引用内部嵌套类Inner.Inner是可以的,但导入Outer.Inner.Inner后仅在Eclipse中有效,而从Maven中无效。谢谢! - JeroenHoek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接