java @override 报错处理
- - Java - 编程语言 - ITeye博客有时候Java的Eclipse工程换一台电脑后编译总是@override报错,把@override去掉就好了,但不能从根本上解决问题,因为有时候有@override的地方超级多. 这是jdk的问题,@Override是JDK5就已经有了,但是不支持对接口的实现,认为这不是Override而报错. JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Override.
@Override注解是作用于源代码的注解,用于表明注解的方法重写了父类型的方法,但是这个注解在1.5和1.6及以后是有区别的。1.5中,只能用于在继承某个类时,重写父类中的方法,而在实现一个接口中的方法时,是不能使用该注解的,从1.6开始,才支持实现父接口的方法使用该注解。但是在@Override源代码文档中,1.6没有对这个变化进行说明,到1.7才进行了说明。
下面是1.5和1.6的源码:
package java.lang; import java.lang.annotation.*; /** * Indicates that a method declaration is intended to override a * method declaration in a superclass. If a method is annotated with * this annotation type but does not override a superclass method, * compilers are required to generate an error message. * * @author Joshua Bloch * @since 1.5 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }意思是:表示一个方法声明打算重写超类中的某个方法声明。如果方法利用此注解类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。
下面是1.7的源码:
package java.lang; import java.lang.annotation.*; /** * Indicates that a method declaration is intended to override a * method declaration in a supertype. If a method is annotated with * this annotation type compilers are required to generate an error * message unless at least one of the following conditions hold: * * <ul><li> * The method does override or implement a method declared in a * supertype. * </li><li> * The method has a signature that is override-equivalent to that of * any public method declared in {@linkplain Object}. * </li></ul> * * @author Peter von der Ahé * @author Joshua Bloch * @jls 9.6.1.4 Override * @since 1.5 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }意思是:表示一个方法声明打算重写父类型中的某个方法声明。如果方法利用此注解类型进行注解时,编译器必须生成一条错误消息,除非满足下列两个条件之一:
关于重写等价的意思可以查看 http://stackoverflow.com/questions/16207386/what-is-override-equivalence-and-how-is-it-related-to-override
可以注意到两个词的变化:
Indicates that a method declaration is intended to override a method declaration in a superclass.
Indicates that a method declaration is intended to override a method declaration in a supertype.
那就是1.5中是superclass,则1.7中是supertype。一个是父类,一个是父类型。为什么1.6的文档没有对此变化进行修改,但实质上却支持实现接口的方法可以使用@Override,无从知晓,可能是没有及时的更新文档吧。