2010-02-25 74 views
50

當我實現接口的方法時,Eclipse正在添加@Override註釋。 Eclipse似乎對此沒有任何問題。而Cruise Control的自動化構建過程似乎對此沒有任何問題。但是當我從命令行構建,使用運行javac的ant時,出現此錯誤:爲什麼javac在@Override註釋上失敗

[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構建都會失敗。

回答

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,就需要找到一種讓編譯器感到滿意的方法。

Here's a screenshot of changing the compiler in eclipse

+6

這是一個很好的答案;我有一件事要補充:如果出於任何原因想要保留在JDK 1.5上,只需升級到最新的更新版本即可。我使用u21,它編譯這些類型的@Overrides就好了。 – 2010-02-25 16:45:53

+1

酷 - 我會將其添加到我的答案。 – 2010-02-25 16:53:33

+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:方法不從其超 @覆蓋覆蓋方法public void run(){} ^ 1錯誤 [發行說明](http://java.sun.com/j2se/1.5.0/ReleaseNotes.html)中沒有提及。 – djb 2010-07-16 17:42:14

16

我真的不能解釋你所看到的問題,但它似乎與這樣的事實:JDK 5將不允許@Override接口的實施方法,只存在於一個覆蓋的方法超級類

JDK 6將允許@Override其中任何一個。

如果您的ant構建失敗,它可能會將source參數傳遞給javac,要求遵從JDK 5。

3

@實現方法的覆蓋標籤是Java 1.6的新標籤。在Java 1.5中,@Override只有在重寫基類中的方法時纔是正確的。閱讀更多herehere

0

的Eclipse將指向1.6版本的Java,而不是1.5。 See here用於在eclipse中配置java版本。

3

直接回答「爲什麼」的錯誤是由javac的提出時@覆蓋的方法實現的上下文中使用的問題,實際上是在Java規範:

"The rationale for this is that a concrete class that implements an interface will necessarily override all the interface's methods irrespective of the @Override annotation, and so it would be confusing to have the semantics of this annotation interact with the rules for implementing interfaces."

http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.6.1.4

但是,顯然有人改變了他的想法,因爲java 1.6和1.5 u21 ...

0

確保只有一個接口的定義。

實施例: 的HttpServletRequest

這是具有取決於提供商不同規格的接口。

比較pax-web-jetty和apache-felix-jetty。他們有不同的方法。

0

我在使用ANT構建項目時遇到了同樣的問題。該問題的解決辦法是改變build.properties文件裏面以下屬性:

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

到:

javac.compiler=modern 

這解決了這個問題,該項目得到了編譯和部署成功。