Eclipse喜欢它,javac讨厌它,它';这是一个枚举,有点像,有一个接口

Eclipse喜欢它,javac讨厌它,它';这是一个枚举,有点像,有一个接口,java,eclipse,enums,Java,Eclipse,Enums,EclipseIndigo,Java1.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()这

EclipseIndigo,Java1.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中都可以正常工作。

getName()
E1
中应该是
public
——这就是导致您出现问题的原因吗?否则,您将尝试使用包私有方法覆盖公共方法(接口中声明的所有方法都是公共的),这是不允许的。

接口方法是公共范围的。增加枚举中的可见性级别,它将成功编译。作为补充说明,您的代码在我的Eclipse版本(运行在Mac 0S X 10.7.2和JDK 1.6上的Indigo)中显示了一个编译错误。

首先,我同意@yshavit

否则,它可能与此相关:


我认为这和名字顺序有关。尝试将接口重命名为A,它可能会先编译,一切都会正常工作。

请记住,Eclipse实现了自己的解析器和编译器,它提供了与编辑器紧密绑定的输出。通常,它工作得很好;然而,当一个新的语言特性开始发挥作用时,编译器往往会在实现新的语言特性方面落后

javac
命令行(几乎)总是正确的,假设您从Oracle/SUN获得javac


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

它应该被允许。这个问题是相关的:您得到了什么
javac
错误?也与刚刚在
eclipseindigo SR1
中检查到的错误有关。没有按预期编译。只是好奇而已。仅仅因为没人知道enum可以在Java中实现一个接口,或者因为一个标题,这有这么多的投票权吗?我想两者都有:)直到一周前,我才知道枚举常量可以有类主体,当时有人提交了一份错误报告,说我的反编译器没有处理它们。如果很多人从这个问题中学到了新东西,我也不会感到惊讶:)。