【问题标题】:Eclipse loves it, javac hates it, it's an enum, sort of, with an interfaceEclipse 喜欢它,javac 讨厌它,它是一个枚举,有点像,有一个接口
【发布时间】:2012-03-07 18:08:36
【问题描述】:

Eclipse 靛蓝,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 错误吗?

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

【问题讨论】:

  • 应该允许。这个问题是相关的:stackoverflow.com/questions/2709593/… What javac error are you getting?
  • 刚刚在Eclipse Indigo SR1 中检查了这个。没有按预期编译。
  • 只是好奇。是因为没有人知道 enum 可以在 Java 中实现接口,还是因为标题,所以有这么多的赞成票?我认为两者都有:)
  • 直到一周前我才知道枚举常量可以有类体,当时有人提交了一个错误报告,说我的反编译器没有处理它们。如果很多人从这个问题中学到新东西,我不会感到惊讶:)。

标签: java eclipse enums


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先我同意@yshavit。

    否则可以和这个相关:Workaround for javac compilation order bug in maven

    我认为这与名称顺序有关。尝试重命名您的接口 A,它可能会先编译,然后一切正常。

    【讨论】:

      【解决方案3】:

      接口方法是 public 范围的。增加枚举中的可见性级别,它应该可以成功编译。附带说明一下,您的代码在我的 Eclipse 版本中显示编译错误(在 Mac 0S X 10.7.2、JDK 1.6 上运行的 Indigo)。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2010-12-22
          • 2015-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多