关于java:为什么javac在@Override注释上失败

Why is javac failing on @Override annotation

Eclipse在实现接口方法时添加了@override注释。Eclipse似乎对此没有问题。我们的巡航控制系统的自动构建过程似乎对此没有问题。但是当我从命令行构建时,使用Ant运行javac,我会得到以下错误:

1
2
3
4
[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下运行的。巡航控制正在运行Java 1.5。我的Ant构建失败,不管我使用的是哪种版本的Java。


在Java 1.6中更改了@重写注释规范。在Java 1.5中,编译器不允许在实现的接口方法上使用@重写注释,但在1.6中它允许。我找到的第一个搜索结果是一篇博客文章。它没有很好的文档记录,但确实发生了变化。

Eclipse正在添加它,因为您的Eclipse设置为1.6符合性。您应该尝试将您的构建和Eclipse环境保持在同一版本的Java上。目前还不清楚,您指定的巡航控件是否运行Java 5,无论它是否使用单独的JDK6编译。

与上述1.5 vs 1.6@override注释规则不同,记住Eclipse有自己的编译器实现(而不是javac),并且偶尔会有不同的行为。每当Eclipse中编译了一些东西,但不是Ant或Maven时,您需要找到一种让两个编译器都满意的方法。

Here's a screenshot of changing the compiler in eclipse


我不能真正解释您所看到的问题,但它似乎与这样一个事实有关:JDK5不允许在接口的已实现方法上使用@Override,只允许在超类中存在的已重写方法上使用。

JDK6将允许在其中任何一个上使用@Override

如果您的Ant构建失败,它可能会向javac传递一个source参数,要求遵从JDK5。


当在方法实现的上下文中使用@重写时,Javac提出的"为什么"错误的直接答案实际上是在Java规范中:

"其基本原理是,实现接口的具体类必须重写所有接口的方法,而不管@override annotation如何,因此让此注释的语义与实现接口的规则交互将是混淆的。"

参见http://java.xun.com /DOCS/Booo/JL/TyddieEng/HTML/Teleal.HTML*7.1.1.4

但显然有人改变了主意,Java 1.6和1.5 U21…


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


很多人,包括我,都被这件事搞砸了。看这里有更大的讨论


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

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

到:

1
javac.compiler=modern

解决了这个问题,项目被成功地编译和部署。


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

例子:httpservletrequest(httpservletrequest)

这是一个具有不同规格的接口,具体取决于提供程序。

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


Eclipse将指向Java 1.6版本而不是1.5版本。请参见此处配置Eclipse中的Java版本。