关于@Override在1.5和1.6之后的区别

标签: override | 发表时间:2015-08-29 23:53 | 作者:mhmyqn
出处:http://blog.csdn.net

@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 {
}
意思是:表示一个方法声明打算重写父类型中的某个方法声明。如果方法利用此注解类型进行注解时,编译器必须生成一条错误消息,除非满足下列两个条件之一:

  • 该方法重写或实现了父类型中声明的某个方法
  • 该方法的签名与Object类中声明的某个公共方法重写等价(override-equivalent)的

关于重写等价的意思可以查看 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,无从知晓,可能是没有及时的更新文档吧。

作者:mhmyqn 发表于2015/8/29 15:53:38 原文链接
阅读:94 评论:0 查看评论

相关 [override] 推荐:

java @override 报错处理

- - Java - 编程语言 - ITeye博客
有时候Java的Eclipse工程换一台电脑后编译总是@override报错,把@override去掉就好了,但不能从根本上解决问题,因为有时候有@override的地方超级多. 这是jdk的问题,@Override是JDK5就已经有了,但是不支持对接口的实现,认为这不是Override而报错. JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Override.

关于@Override在1.5和1.6之后的区别

- - CSDN博客推荐文章
@Override注解是作用于源代码的注解,用于表明注解的方法重写了父类型的方法,但是这个注解在1.5和1.6及以后是有区别的. 1.5中,只能用于在继承某个类时,重写父类中的方法,而在实现一个接口中的方法时,是不能使用该注解的,从1.6开始,才支持实现父接口的方法使用该注解. 但是在@Override源代码文档中,1.6没有对这个变化进行说明,到1.7才进行了说明.