Liny_@NotePad

沉迷ACG中

java6的@override注解与java5的不同之处

YOYO posted @ 2008年8月18日 09:28 in 【Java SE】 with tags java JDK @override override 重写 , 2141 阅读

我在自己PC上跑好的程序在机房有时不能通过编译,把@override去掉倒正常了,但是有的代码则不会出错。
百度了下,原来是重写接口方法时才会遇到的问题。(怪不得总是在重写侦听器方法时遇到@_@)。
但是它并没有告诉解决方法:(

【以下转载自一界书生的CSDN BLOG】http://blog.csdn.net/wangjian5748/archive/2007/08/10/1736294.aspx

首先看一下下面的示例代码:
Parent.java

  1. public class Parent{
  2.     public void parentMethod() {
  3.     }
  4. }

IChild.java

  1.   public interface IChild {
  2.     void interfaceMethod();
  3. } 

Child.java

  1.   public class Child extends Parent implements IChild {
  2.  
  3.     @Override
  4.     public void parentMethod() {
  5.     }
  6.  
  7.     @Override
  8.     public void interfaceMethod() {
  9.     }
  10. } 

由于代码很简单,我就不做说明

上述代码在jdk6下可以编译通过

而在jdk5下编译无法通过,输出的错误信息如下:

Child.java:7: 方法未覆盖其父类的方法
   @Override
    ^   
1 错误

上面的错误信息说在Child.java第七行的Override注解是不对的,不对的原因是该方法(interfaceMethod)不是父类方法。

当然,实际上这个方法是类实现的接口中方法,但是,这个语法的jdk6的下面是可以通过的,也就是说java6认为类覆盖父类方法与实现接口方法都叫override,而jdk5不是这样认为的,不知道这是当初jdk5的bug,还是当初就是认为覆盖父类方法与实现接口方法是不一样的,不得而知。但是从OO角度来看,覆盖父类方法与实现接口方法都可以认为override,因为他们目的都是一样的,都是为了重用,都是多态的一种表现方式。这从jdk6的支持这个功能就可以看出。

差一点忘了:

标准的java api文档java5与java6对Override annotation的的解释一样的

java5:

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.

java6:

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.

两段说明一模一样,让人搞不清楚的是java6文档没有提到Override对interface的支持。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter