为什么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一种方法,使编译器感到高兴。
我不能真正解释你所看到的问题,但这似乎与JDK 5不允许在接口的已实现方法上使用@Override
有关,只有在超类中存在的重载方法才能使用。
JDK 6将允许@Override
中的任何一个。
如果您的ant构build失败,则可能会将source
parameter 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
解决了这个问题,项目得到了成功的编译和部署。