所以我在这里尝试了关于编写可扩展枚举的"有效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注释上失败