使用接口模拟可扩展枚举



所以我在这里尝试了关于编写可扩展枚举的"有效Java第二版"练习。

不过,我遇到了一个非常奇怪的问题——我让每个枚举实例实现了接口方法,并且在eclipse中看起来都很好。但当我试图通过maven编译它时,它失败了,尽管eclipse以前根本没有抛出任何编译错误(我的eclipse和maven都使用相同的JDK:1.6.0_33-b05)。事实证明,我也必须重写枚举内部(所有枚举实例之外)的接口方法[从现在起我将称之为方法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());
  }
}

奇怪的是,eclipse在没有方法'X'的情况下完全可以,但maven编译会在Y行失败,即

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

如果我有方法X,我的eclipse保存操作会自动插入@Override。删除方法X会在我以前的Override注释上的eclipse中引发编译错误。

以下是我的问题:1.为什么maven在这种情况下不编译,而eclipse会编译呢?2.覆盖注释错误在这里意味着什么?3.方法X是否可以以某种方式访问?我缺少什么来理解?

@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编译插件发布的

请注意,目前默认的源设置是1.5,默认的目标设置是1.5。这与运行Maven的JDK无关。如果要更改这些默认值,则应按照设置Java编译器的-source和-target中的说明设置source和target。

阅读更多

  • @覆盖Snafu
  • 为什么javac在@Override注释上失败

最新更新