当我有一个覆盖超类方法而没有指定@Override注释的类时,我试图让我的java构建失败。
构建是通过ant完成的,我已将以下元素添加到<javac>
任务中:
<compilerarg value="-Werror"/>
<compilerarg value="-Xlint:unchecked,overrides"/>
正在遵循unchecked
选项,但忽略了overrides
选项。我还尝试将两个Xlint
选项分成两个单独的<compilerarg>
元素,但无济于事。我误解了这个选项的用途吗?
一个注意事项:这是MacOSX上的JDK6(10.6)。我可以遇到特定于OSX的错误吗?
答案 0 :(得分:4)
我相信你误解了Xlint:overrides
行为。
据我所知,启用此检查会导致编译器在遇到使用@Override
注释但实际上未覆盖超类方法的方法时发出警告(或可能是错误)。但是,它不会检查所有重写的方法是否都正确注释。
@Override
时,编译器将发出错误,无论是否有Xlint
选项。
Oracle's website上的文档甚至没有提到Xlint:覆盖选项,所以我猜它没有实现。
答案 1 :(得分:1)
Xlint:覆盖比@Override更微妙。 @Override(正如Cameron Skinner指出的那样)如果它注释了一个实际上没有覆盖另一个方法的方法,它将导致编译器发出错误。但是,如果已经使用varargs参数标记了一个方法来覆盖另一个没有varargs参数但是使用数组的方法,则Xlint:覆盖选项会产生警告。这里有一个很好的解释:
http://marxsoftware.blogspot.com/2010/10/javacs-xlint-options.html