2010-12-01 152 views
4

我試圖讓我的java構建失敗,當我有一個類沒有指定@Override註解來覆蓋超類方法時。javac -Xlint:覆蓋不起作用

構建正在通過螞蟻做的,我已經添加了以下內容我<javac>任務:

<compilerarg value="-Werror"/> 
<compilerarg value="-Xlint:unchecked,overrides"/> 

unchecked選項被跟蹤,但overrides選項被忽略。我也嘗試將兩個Xlint選項分成兩個單獨的<compilerarg>元素,但無濟於事。我誤解了這個選項的作用?

注意:這是MacOSX上的JDK6(10.6)。我可以運行到一個OSX特定的錯誤?

+0

在我的OS X機器上正常工作。我在這裏使用覆蓋示例進行了測試:http://www.javaworld.com/community/node/5276 javac 1.6.0_22 – 2010-12-02 00:12:19

+0

如果您使用IntelliJ IDEA,它會檢查是否執行此操作,但默認情況下不啓用,你可以去設置>檢查>丟失覆蓋註釋 – 2011-10-05 22:51:19

回答

4

我相信你誤解了Xlint:overrides的行爲。

據我所知,啓用此檢查會導致編譯器在遇到使用@Override註解的方法時發出警告(或者可能是錯誤),該方法實際上並未覆蓋超類方法。但是,它不檢查所有重寫的方法是否正確註釋。

編輯:只是測試它。如果在不覆蓋超類方法的方法上指定@Override,編譯器將會發出錯誤,不論是否使用Xlint選項。

關於Oracle's website的文檔甚至沒有提及Xlint:overrides選項,所以我猜測它沒有實現。

0

Xlint:覆蓋比@Override更微妙。 @Override(正如Cameron Skinner所指出的)如果它註釋了一個事實上不會覆蓋另一個方法的方法,那麼編譯器將會發出一個錯誤。但是,如果使用varargs參數標記了一個方法來覆蓋另一個沒有varargs參數但卻使用數組的另一個方法,則Xlint:overrides選項會產生警告。在這裏找到一個很好的解釋:

http://marxsoftware.blogspot.com/2010/10/javacs-xlint-options.html