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时,您需要找到一种让两个编译器都满意的方法。
我不能真正解释您所看到的问题,但它似乎与这样一个事实有关:JDK5不允许在接口的已实现方法上使用
JDK6将允许在其中任何一个上使用
如果您的Ant构建失败,它可能会向javac传递一个
当在方法实现的上下文中使用@重写时,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版本。