我正在使用 Eclipse,当我使用快捷方式生成覆盖实现时,会出现一个覆盖注释,我正在使用 JDK 6,这是没问题的,但在 JDK 5 下,这个注释会导致错误。因此,我想问一下,这个注释完全没有用吗?编译器是否会使用这个注释进行某种优化?
我正在使用 Eclipse,当我使用快捷方式生成覆盖实现时,会出现一个覆盖注释,我正在使用 JDK 6,这是没问题的,但在 JDK 5 下,这个注释会导致错误。因此,我想问一下,这个注释完全没有用吗?编译器是否会使用这个注释进行某种优化?
它的目的是为了编译器能够告诉您方法实际上没有覆盖超类方法。例如,假设您拼错了名称,使用注释,编译器将警告您该方法没有覆盖任何内容,因此您将能够捕获错误,而不是运行程序并不理解为什么从未调用该方法。
注解非常有价值,因为它将清晰地表明新方法是否覆盖了父类的方法。例如,您可能认为自己正在进行覆盖,但实际上您拼错了方法名(或被覆盖的方法的签名已经发生了变化)。
这并不是无用的。它有助于读者理解代码,也能帮助作者避免错误。
话虽如此,JDK 5和JDK 6在使用@Override
时会有所不同,如果它们引起问题,只需将其删除即可。它们在功能上没有任何区别。
@Override
注释实际上是一个编译器指令,它告诉javac
如果带有@Override
注释的方法没有真正重写其父类中的方法(例如,您实际上是进行重载,因为您决定更改方法签名或拼错了方法名称),那么就会发出警告。@Override
进行注释,则被视为错误。@Override
注释实现的接口方法是正确的。编译代码时要针对您将部署的JDK进行编译。
问题在于,在6版本中,注释适用于从基类继承的重写方法和接口中定义的方法,但仅适用于5版本中重写方法。因此,在接口中定义的方法上使用@override将导致JDK 5中的错误。