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

ski*_*ppy 53 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
Run Code Online (Sandbox Code Playgroud)

Eclipse在Java 1.6下运行.Cruise Control正在运行Java 1.5.无论我使用哪个版本的Java,我的ant构建都会失败.

Jos*_*non 99

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

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

与上面的1.5 vs 1.6 @Override注释规则分开,记住Eclipse有自己的编译器实现(不是javac),偶尔会有不同的行为.每当在Eclipse中编译某些东西,而不是在Ant或Maven中编译时,您将需要找到一种方法来使两个编译器都满意.

这是在eclipse中更改编译器的屏幕截图

  • 这是一个很好的答案; 我有一件事要补充:如果出于任何原因你想继续使用JDK 1.5,你只需要升级到最新的更新版本.我正在使用u21,它可以很好地编译这些类型的@Overrides. (6认同)
  • 我安装了JDK 1.5u21和1.5u22,javac不允许在任一版​​本中的接口方法实现上使用@Override.下面,MyRunnable实现java.lang.Runnable:c:/Java/jdk/1.5.0_21/bin/javac MyRunnable.java MyRunnable.java:3:方法不会覆盖其超类的方法@Override public void run(){ } ^ 1错误[发行说明](http://java.sun.com/j2se/1.5.0/ReleaseNotes.html)中也没有提到它. (6认同)

Mar*_*tin 16

我无法解释你所看到的问题,但它似乎与JDK 5不允许接口的已@Override实现方法,仅限于超类中存在的重写方法有关.

JDK 6将允许其中@Override任何一个.

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