【问题标题】:Emulating extensible enums using interfaces使用接口模拟可扩展枚举
【发布时间】:2013-12-07 17:06:47
【问题描述】:

所以我在这里尝试了这个关于编写可扩展枚举的“Effective Java 2nd edition”练习。

不过,我遇到了一个非常奇怪的问题——我让每个枚举实例都实现了接口方法,并且在 Eclipse 中看起来都很好。但是当我尝试通过 maven 编译它时,它失败了,尽管 eclipse 之前根本没有抛出任何编译错误(我的 eclipse 和 maven 都使用相同的 JDK:1.6.0_33-b05)。事实证明,我也必须在枚举内部(在所有枚举实例之外)覆盖接口方法 [我从现在开始将其称为 method X] 来解决这个问题!

这里有一个示例说明:

界面:

public interface IDay
{
  public boolean isHoliday(); 
}

枚举:

public enum Day implements IDay
{
  SATURDAY
  {
    @Override
    public boolean isHoliday()
    {
      return true;
    }
  },
  SUNDAY
  {
    @Override
    public boolean isHoliday()
    {
      return true;
    }
  },
  MONDAY
  {
    @Override
    public boolean isHoliday()
    {
      return false;
    }
  };

  // Method X: the project won't compile for me without this method!
  public boolean isHoliday()
  {
    return false;
  }

}

调用:

public class DayTester
{
  public static void main(final String[] args)
  {
    // line Y: this line won't maven compile if I got rid of the method X
    System.out.println("Sunday: " + Day.SUNDAY.isHoliday());
  }
}

很奇怪,没有 'X' 方法,eclipse 完全没问题,但是 maven 编译会在 Y 行失败

[ERROR] 未能执行目标 org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile 项目 X 上的(默认编译):编译失败 [错误] DayTester.java:[7,46] 找不到符号 [错误] 符号: 方法 isHoliday() [ERROR] 位置:类 Day

如果我有方法 X,我的 Eclipse 保存操作会自动插入 @Override。删除方法 X 会在我的 Eclipse 中对我之前拥有的那些 Override 注释抛出编译错误。

这是我的问题: 1.为什么在这种情况下maven eclipse 编译不出来? 2. 这里的 Override 注解错误是什么意思? 3. 方法 X 是否可以通过某种方式访问​​?我想了解什么?

【问题讨论】:

  • 你使用的是什么JDK版本?
  • jdk 版本:1.6.0_33-b05。现在也在 OP 上更新了它。
  • 我认为 maven 使用的 Java 语言 source 版本与 Eclipse 不同。 javac param source 表示“提供与指定版本的源代码兼容性”
  • 可能是奇怪的编码问题,eclipse 和 javac 看到不同的字符。
  • 我怀疑是不是这样。具有相似类结构的完全不同的代码在多台 PC 上表现出相同的行为。

标签: java maven enums


【解决方案1】:

@Override注解

@Override - 检查方法是否为覆盖。如果在某个父类或实现的接口中找不到该方法,则会导致编译错误

Eclipse 配置

Properties > Java Compiler > Compiler compliance level = 1.6

在项目级别也检查Compiler compliance level

Properties > Java Compiler > Errors/Warnings

@Override 注解在注解下,默认被忽略。

Maven 配置

将此属性添加到pom.xml

<properties>
   <maven.compiler.source>1.6</maven.compiler.source>
   <maven.compiler.target>1.6</maven.compiler.target>
</properties>

这是maven-compile-plugin发布的

请注意,目前默认源设置为 1.5,默认目标设置为 1.5,与运行 Maven 的 JDK 无关。如果您想更改这些默认值,您应该按照Setting the -source and -target of the Java Compiler 中的说明设置源和目标。

了解更多

【讨论】:

  • Y 行的编译失败是我在这里试图理解的主要问题。对不起,如果我不清楚。无论如何,我正在设置源和目标设置以查看覆盖注释问题是否消失。编辑:并且在eclipse本身中报告了覆盖注释错误,而不是在我通过maven编译时。
  • 在 Eclipse 中配置了什么源代码级别? stackoverflow.com/questions/1736730/…
  • 如果你的意思是编译器合规级别,它设置为 1.6
  • 项目刷新重建了吗?
  • 是的。也很多次。在 Y 行上按 F3/ctrl+单击也会将我带到界面上的方法定义!顺便说一句,它可以在具有类似设置的不同 PC 上重现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多