当我实现接口的方法时,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构建都会失败。
答案 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时,您将需要找到一种方法来使两个编译器都满意。
答案 1 :(得分:16)
我无法真正解释您所看到的问题,但似乎与 JDK 5 不允许@Override
实施的实施方法有关界面,仅适用于超类中的重写方法。
JDK 6 将允许任何一个@Override
。
如果您的ant构建失败,可能会将source
参数传递给javac,要求符合JDK 5。
答案 2 :(得分:3)
答案 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
解决了问题,项目得到了成功编译和部署。