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

时间:2010-02-25 16:30:59

标签: java annotations

当我实现接口的方法时,Eclipse正在添加@Override注释。 Eclipse似乎对此没有任何问题。我们Cruise Control的自动构建过程似乎对此没有任何问题。但是当我从命令行构建时,使用运行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构建都会失败。

7 个答案:

答案 0 :(得分:99)

Java 1.6中更改了@Override注释规范。在Java 1.5中,编译器不允许在已实现的接口方法上使用@Override注释,但在1.6中它确实如此。我找到的第一个搜索结果是blog post here.。它was not well documented,但确实发生了变化。

Eclipse正在添加它,因为您的Eclipse设置为1.6合规性......您应该尝试将您的构建和eclipse环境保留在相同版本的Java上。我不清楚你指定Cruise Control是否运行Java 5是否使用单独的JDK6进行编译。

除了上面的1.5 vs 1.6 @Override注释规则之外,请记住Eclipse有自己的编译器实现(不是javac),并且偶尔会有不同的行为。每当在Eclipse中编译某些内容,而不是Ant或Maven时,您将需要找到一种方法来使两个编译器都满意。

Here's a screenshot of changing the compiler in eclipse

答案 1 :(得分:16)

我无法真正解释您所看到的问题,但似乎与 JDK 5 不允许@Override实施的实施方法有关界面,仅适用于超类中的重写方法。

JDK 6 将允许任何一个@Override

如果您的ant构建失败,可能会将source参数传递给javac,要求符合JDK 5。

答案 2 :(得分:3)

实现方法的@Override标记是Java 1.6的新增功能。在Java 1.5中,@ Overver仅在覆盖基类中的方法时才是正确的。阅读更多herehere

答案 3 :(得分:3)

在方法实现的上下文中使用@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的想法......

答案 4 :(得分:0)

Eclipse将指向1.6版本的Java而不是1.5版本。 See here用于在eclipse中配置java版本。

答案 5 :(得分:0)

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

实施例:     HttpServletRequest的

这是一个具有不同规格的界面,具体取决于提供商。

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

答案 6 :(得分:0)

使用ANT构建项目时遇到了同样的问题。该问题的解决方案是更改build.properties文件中的以下属性:

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

为:

javac.compiler=modern

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