2010-12-01 61 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