所以我在这里尝试了关于编写可扩展枚举的“Effective Java 2nd edition”练习。
我遇到了一个非常奇怪的问题 - 我让每个枚举实例实现了接口方法,并且在eclipse中看起来都很好。但是当我尝试通过maven编译它时,它失败了,虽然eclipse之前根本没有抛出任何编译错误(我的eclipse和maven都使用相同的JDK:1.6.0_33-b05
)。事实证明,我必须在enum(所有枚举实例之外)中覆盖接口方法[我将其称为方法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行上失败
[错误]无法执行目标 org.apache.maven.plugins:Maven的编译器插件:2.3.2:编译 项目X上的(default-compile):编译失败 [错误] DayTester.java:[7,46]找不到符号[ERROR]符号: 方法isHoliday()[ERROR] location:class Day
如果我有方法X,我的eclipse保存操作会自动插入@Override。删除方法X会在我的eclipse中抛出编译错误,因为我之前使用了Override注释。
以下是我的问题: 1.为什么eclipse在这种情况下不会编译maven? 2.覆盖注释错误在这里意味着什么? 方法X是否可以以某种方式访问?我错过了什么?
答案 0 :(得分:0)
@Override
注释中找不到该方法,则会导致编译错误
@Override
- 检查该方法是否为覆盖。如果在其中一个父类或已实现的接口
Properties > Java Compiler > Compiler compliance level = 1.6
在项目级别检查Compiler compliance level
。
Properties > Java Compiler > Errors/Warnings
@Override
注释位于注释下,默认情况下会被忽略。
将此属性添加到pom.xml
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
发布的
请注意,目前默认的源设置为1.5,默认目标设置为1.5,与您运行Maven的JDK无关。如果要更改这些默认值,则应按照Setting the -source and -target of the Java Compiler。
中的说明设置源和目标