`

关于解决Java @Override的问题

    博客分类:
  • Java
阅读更多

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

Parent.java

public class Parent{
    public void parentMethod() {
    }
}

IChild.java

public interface IChild {
    void interfaceMethod();
}

Child.java

public class Child extends Parent implements IChild {

    @Override
    public void parentMethod() {
    }

    @Override
    public void interfaceMethod() {
    }
}
 

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

上述代码在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的支持。

 

在Eclipse或MyEclipse中开发时,尽管使用JDK的版本是JDK1.6,上面的代码还是会通不过编译的,因为你在建工程时,Eclipse默认的编译器使用的是1.4或者1.5,所以你要把编译器的版本修改为1.6才行,MyEclipse是设置成6.0,其实就是1.6Eclipse中的1.6.

解决办法:Windows->Preferences-->java->Compiler-->compiler compliance level设置成6.0就OK了.


结论(个人观点):  @Override是JDK5就已经有了,但有个小小的Bug,就是不支持对接口的实现,认为这不是Override .而JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Override

分享到:
评论
4 楼 minidick 2016-02-26  
这个有点意思
3 楼 gold__sun 2015-02-03  
貌似1.6.10也是不行的
2 楼 ryxxlong 2010-01-07  
我也是Google了后,总结了一下.呵呵
1 楼 fhqllt 2010-01-06  
高,我也碰到过这样的问题,但一直没有思考为什么。

相关推荐

    android @override 报错解决方案

    现象: … java: 1801: method does not override a method from its superclass @Override… 原因: Eclipse is defaulting to Java 1.5 and you have classes implementing interface methods (which in Java 1.6 ...

    Override错误已解决

    本文将详细介绍 `Override` 错误的成因及其解决方案,并通过具体的实例帮助读者更好地理解和处理这类问题。 #### 二、`Override` 错误产生的原因 1. **JDK 版本不兼容**: - 早期版本的 JDK(如 JDK 5)存在一些 ...

    The method of type must override a superclass method解决方式, myeclipse, java, web

    在Java编程语言中,"The method of type must override a superclass method" 是一个常见的错误提示,它通常出现在子类试图重写父类方法时,但没有按照正确的格式进行。这个错误通常与多态性和继承概念有关,是理解...

    软件设计模式鸭子问题代码Java

    在这个Java实现中,我们将探讨如何使用设计模式来解决鸭子问题。 首先,我们有一个抽象的`鸭子`接口或抽象类,它定义了所有鸭子都应具备的行为,如`quack()`(嘎嘎叫)和`fly()`(飞行)。这样的设计使得我们可以为...

    关于适用于核心 Java、Android 的基于 PubNub Java 的 API

    这个“关于适用于核心 Java、Android 的基于 PubNub Java 的 API”主题涵盖了如何在 Java 和 Android 开发环境中使用 PubNub API 的关键知识点。 首先,我们要理解 PubNub 的工作原理。它是一个基于发布/订阅模型的...

    DialogFragment的使用及利用自定义interface点击事件并解决旋转屏幕点击事件失效问题

    通过以上步骤,你不仅可以掌握DialogFragment的基本使用,还能了解到如何利用自定义接口处理点击事件,并解决因屏幕旋转导致的事件失效问题。在实际项目中,这些知识将帮助你构建更稳定、更健壮的Android应用。

    个人开发中遇到常见问题及解决办法(吐血总结)

    9 Java @override报错的解决方法 10 js实现 选中子页面的checkbox,点击确认,将选中的数据显示到父页面 11 解析oracle的rownum 12 ava web项目中开放一个webservice接口实例 13 js方式实现 系统时间显示 14 js 按...

    springboot接管SpringMVC1

    问题的由来 在 Spring Boot 之前,我们通常继承 WebMvcConfigurerAdapter 来实现 URL 的定向。例如,我们可以通过重写 addViewControllers 方法来添加视图控制器,或者通过重写 addInterceptors 方法来添加拦截器。...

    FragmentStatePagerAdapter中片段的状态恢复问题示例_Java_Groovy_下载.zip

    本示例将深入探讨这个问题,并提供解决方案。 首先,我们需要理解Android的生命周期。当设备旋转时,由于配置改变(如屏幕方向变化),系统会默认销毁当前Activity及其所有的`Fragment`。为了解决状态丢失问题,...

    【springboot】接口多实现类,选择性注入的4种解决方案.pdf

    Spring Boot 中接口多实现类的...本文介绍了四种解决 Spring Boot 中接口多实现类的选择性注入问题的方案,包括两种相对低级的解决方案和两种相对高级的解决方案。开发者可以根据自己的实际需求选择合适的解决方案。

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    Java设计模式是面向对象编程中的重要概念,它们是解决常见问题的经验总结,为代码的可重用性、可维护性和可扩展性提供了指导。这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory ...

    java filter打印请求返回参数

    4. **解决乱码问题**:通过设置响应输出流的字符集编码来避免乱码。 #### 三、具体实现细节 ##### 1. 封装`HttpServletRequest` - 实现`HttpServletRequestWrapper`子类,重写`getReader()`和`getInputStream()`...

    java工厂方法模式和抽象工厂模式实例

    在软件设计模式中,工厂模式是一种非常基础且实用的设计模式,它主要用来解决对象创建的问题。工厂模式的主要目的是封装对象的创建过程,使得代码在不指定具体类的情况下创建对象。根据描述,我们将深入探讨Java中的...

    java抽象工厂模式实现

    抽象工厂模式是设计模式中的一种,它属于创建型模式,主要解决的是当系统需要创建一系列相关或相互依赖的对象时,而这些对象的类可能在运行时未知,这时可以通过抽象工厂模式来提供一个创建对象的接口,使得系统可以...

    设计模式之中介模式Java实现版本

    设计模式是软件工程中的一种最佳实践,它提供了解决常见问题的标准模板。中介模式(Mediator Pattern)属于行为设计模式,它旨在降低多个对象之间的复杂交互,通过引入一个中介对象来封装原本复杂的网状结构,使得...

    代码中大量的 if else如何优化.doc

    为了解决这个问题,我们可以使用枚举来实现策略模式。例如: ```java public enum Strategy { FAST { @Override void run() { // do something } }, NORMAL { @Override void run() { // do something } ...

    关于java解决乱码问题的一些想法

    解决Java乱码问题通常有以下几种方法: 1. 文件读写时指定编码:使用`FileReader`和`FileWriter`时,可以通过传递`Charset`对象来指定编码。例如: ```java FileReader reader = new FileReader("file.txt", ...

    浅析Java设计模式【2】——适配器

    ### 浅析Java设计模式【2】——适配器 #### 概念解析 适配器模式是一种常用的设计模式,其核心在于“适配”二字,即如何将...开发者可以根据实际需求选择合适的适配器模式来解决问题,从而提高代码的复用性和灵活性。

Global site tag (gtag.js) - Google Analytics