2010-12-01 5 views
4

@Overrideアノテーションを指定せずにスーパークラスメソッドをオーバーライドするクラスがある場合、Javaビルドを失敗させようとしています。javac -Xlint:オーバーライドが機能しない

ビルドがアリを介して行われている、と私は私の<javac>タスクに以下の要素を追加しました:

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

uncheckedオプションが続いているが、overridesオプションは無視されています。私はまた、2つの別々の<compilerarg>要素に2つのXlintオプションを分けることを試みました。私はこのオプションが何をしているのか誤解していますか?

注:これはMacOSX(10.6)のJDK6です。 OSX固有のバグに遭遇していますか?

+0

OS Xマシンで正常に動作します。私はここでオーバーライドの例を使ってテストしました:http://www.javaworld.com/community/node/5276 javac 1.6.0_22 –

+0

IntelliJ IDEAを使用する場合、これを行うための検査がありますが、デフォルトでは有効になっていません設定>検査>不在時の注釈 –

答えて

4

Xlint:overridesの動作を誤解していると思います。

私が知っている限り、このチェックを有効にすると、実際にスーパークラスメソッドをオーバーライドしない@Overrideという注釈付きのメソッドが見つかると、コンパイラは警告(またはエラー)を出すでしょう。ただし、オーバーライドされたすべてのメソッドに注釈が正しく付加されているかどうかはチェックされません。

編集:ちょうどそれをテストしました。 Xlintオプションの有無にかかわらず、スーパークラスメソッドをオーバーライドしないメソッドで@Overrideを指定すると、コンパイラはエラーを発生させます。

Oracle's websiteのドキュメントでは、Xlint:overridesオプションについては言及していないので、実装されていないと推測しています。

+0

に行くことができます。それはその質問に答えるものです。さて、オーバーライドされたメソッドで@Overrideが不在のときにビルドに失敗する方法を理解する必要があります... –

+0

FindbugsやCheckstyleにこの種のエラーで失敗する可能性があると思います...私は漠然としています覚えている、私は間違っている可能性がありますそれはどこかにある道具になるだろう:) –

+0

@CameronSkinner私はちょうどFindbugsとCheckstyleを見て、どちらにもそのようなチェックがありませんでした。 CheckstyleにはMissingOverrideチェックがありますが、「javadocタグが存在する場合はjava.lang.Overrideアノテーションが存在することを確認する」ため、ドキュメントを忘れても機能しません。 – Eponymous

0

Xlint:オーバーライドは@Overrideよりも微妙です。 @Override(Cameron Skinnerが指摘するように)は、別のメソッドを実際にオーバーライドしないメソッドに注釈を付けると、コンパイラによってエラーが生成されます。しかし、Xlint:overridesオプションは、varargsパラメータを持つメソッドをマークして、varargsパラメータを持たず、代わりに配列を使用する別のメソッドを上書きする警告を生成します。ここに良い説明があります:

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