问题 Eclipse喜欢它,javac讨厌它,它是一个枚举,有点接口


Eclipse indigo,java 1.6

public interface I {
  String getName();
}

/* and in another file */

public enum E implements I {
  E1() {
     String getName() { return "foo"; }
  };
}

在Eclipse中,这有效!其他类可以在类型I的引用上调用getName()。实际的javac拒绝它,声称枚举中没有getName()这样的东西。这只是一个Eclipse bug吗?

请注意,对此有些奇怪的是方法定义 在枚举器内。如果我做正常的事情,它在Eclipse和Javac中都可以正常工作,并且在枚举的底部定义了返回字段值的函数。


5196
2018-03-07 18:08


起源

它应该被允许。这个问题是相关的: stackoverflow.com/questions/2709593/... 什么 javac 你得到的错误? - Mike Kwan
标题为+1。 :-) - Platinum Azure
也与...有关 stackoverflow.com/questions/9505857/... - Nicocube
刚刚检查过 Eclipse Indigo SR1。不按预期编译。 - jFrenetic
只是好奇。这有多少赞成,只是因为没有人知道枚举可以用Java实现接口,还是因为标题?我想两个:) - jFrenetic


答案:


首先,我同意@yshavit。

否则它可能与此相关: maven中javac编译命令错误的解决方法

我认为它的名称顺序相关。尝试重命名你的界面A,它可能首先编译,事情应该工作。


1
2018-03-07 18:17





getName() 在 E1 应该 public  - 那是什么导致你的问题?否则,您尝试使用package-private方法覆盖公共方法(接口中声明的所有方法都是公共方法),这是不允许的。


12
2018-03-07 18:11





接口方法是 上市 作用域。提高枚举中的可见性级别,它应该成功编译。作为旁注,您的代码在我的Eclipse版本中显示编译错误(在Mac 0S X 10.7.2,JDK 1.6上运行的Indigo)。


1
2018-03-07 18:17





请记住,Eclipse实现了自己的解析器和编译器,它提供了与其编辑器紧密绑定的输出。通常,它运作良好;但是,当新的语言功能发挥作用时,编译器在实现新语言功能时往往会落后。

javac 命令行(非常接近)总是正确的,假设您从Oracle / SUN获得了javac。

yshavit的答案是最好的,因为它确定了它不应该在Eclipse中编译的原因。到现在为止,我想它已被修复(并且在Eclipse中正确编译)。


0
2018-06-19 22:03