为什么javac在@Override注释上失败

当我实现一个接口的方法时,Eclipse正在添加@Override注释。 Eclipse似乎没有这个问题。 而Cruise Control的自动化构build过程似乎没有问题。 但是,当我从命令行构build,运行javac的ant,我得到这个错误:

[javac] C:\path\project\src\com\us\MyClass.java:70: method does not override a method from its superclass [javac] @Override [javac] ^ [javac] 1 error 

Eclipse在Java 1.6下运行。 Cruise Control正在运行Java 1.5。 无论我使用哪个版本的Java,我的ant构build都会失败。

在Java 1.6中更改了@Override注释规范。 在Java 1.5中,编译器不允许在已实现的接口方法上使用@Override注释,但是在1.6版本中它是这样做的。 我find的第一个search结果是这里的博客文章。 。 这是没有很好的文件 ,但它确实改变。

Eclipse正在添加它,因为您的Eclipse被设置为1.6合规性…您应该尝试使您的构build和eclipse环境保持在同一版本的Java上。 您指定的Cruise Control是否运行Java 5,是否使用单独的JDK6进行编译,这一点还不清楚。

独立于上述1.5和1.6 @Override注释规则,请记住,Eclipse有它自己的编译器实现(不是javac),偶尔会有不同的行为。 每当在Eclipse中编译的东西,而不是Ant或Maven,你将需要find一种方法,使编译器感到高兴。

这是一个在eclipse中改变编译器的截图

我不能真正解释你所看到的问题,但这似乎与JDK 5不允许在接口的已实现方法上使用@Override有关,只有在超类中存在的重载方法才能使用。

JDK 6将允许@Override中的任何一个。

如果您的ant构build失败,则可能会将sourceparameter passing给javac,以请求遵从JDK 5。

实现方法的@Override标签是Java 1.6新增的。 在Java 1.5中@Override只有在重写基类中的方法时才是正确的。 阅读更多这里和这里 。

当在方法实现的上下文中使用@Override时,由javac引发的“为什么”错误的直接答案实际上是在java规范中:

“其理由是,实现接口的具体类必须覆盖所有接口的方法,而不考虑@Override注释,所以将这个注解的语义与实现接口的规则进行交互会是令人困惑的。

请参阅http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.6.1.4

但显然有人改变了他的思想Java 1.6和1.5 U21 …

很多人,包括我在内,都被这个捣乱了。 在这里看到一个更大的讨论

Eclipse会指向1.6版本的Java而不是1.5。 在这里看到在Eclipse中configurationJava版本。

确保该接口只有一个定义。

例如:HttpServletRequest

这是取决于提供者的不同规格的接口。

比较pax-web-jetty和apache-felix-jetty。 他们有不同的方法。

与ANTbuild立项目时,我也有同样的问题。 问题的解决scheme是更改build.properties文件中的以下属性:

 javac.compiler=org.eclipse.jdt.core.JDTCompilerAdapter 

至:

 javac.compiler=modern 

解决了这个问题,项目得到了成功的编译和部署。