java - Java 中的@Override 注解

标签 java interface annotations overriding

例如,当我用 Java 实现接口(interface)时:

public interface IColumnHeader {

 public String getHeaderValue();
 public String findColumnValueFromHeaderValue(String parseFrom);

}

下面的枚举实现了上面的接口(interface):

public enum FileColumnDwellTime implements IColumnHeader {

    REPORTER_USER_ID {

        @Override
        public String getHeaderValue() {
            return "reporter_user_id";
        }

        @Override
        public String findColumnValueFromHeaderValue(String parseFrom) {
            return parseFrom;
        }
    };

}

为什么在Java中实现接口(interface)并实现接口(interface)中的方法会引入@Override注解。这不是完全用词不当吗?

该注释实际上不应该被称为“@Implementation”之类的东西吗?

@Override 注释更适用于实际覆盖预定义父类(super class)方法的子类。在简单地从接口(interface)实现方法的情况下,不会进行实际的覆盖。

我说得对吗?

(如果我是 Java 9 的 JLS 编写者,我会有一个名为 @Implementation 的新注解,在从接口(interface)实现方法等的情况下,它将“子类化”@Override 注解。)

最佳答案

看一下 JLS,它似乎就是这样定义的。我正在查看 JLS 8,不确定我要引用的部分在早期版本中是否有所不同(尽管我非常怀疑它会有所不同,因为界面交互不应该改变)。来自 8.4.8.1 节:

An instance method mC declared in or inherited by class C, overrides from C another method mI declared in an interface I, iff all of the following are true:

  • I is a superinterface of C.
  • mI is an abstract or default method.
  • The signature of mC is a subsignature (§8.4.2) of the signature of mI.

因此至少基于此,@Override 注释是有意义的,因为它表示基于 JLS 中的定义覆盖接口(interface)中声明的方法的实例方法。


不幸的是,对于为什么这被称为覆盖,我无法给出权威的答案,但在我的脑海中它是这样工作的:

如果您继承了一个抽象 方法(如接口(interface)中的方法),您的类会在其主体中隐式包含该方法的签名。当您实现与该签名对应的方法时,您用与具体实现对应的签名替换(并因此覆盖)继承的抽象方法签名。所以使用 @Override 是有意义的,对吧?

此外,这种方式 @Override 将适用于被覆盖的方法,无论它们在技术上是一个实现还是“真正”被覆盖。为什么要为自己(和编译器设计者)做更多的工作?

我知道这是对继承如何运作的一种相当糟糕的看法,但我希望它是有道理的。


所以我想最后我会说你错了。有压倒性的完成。但我不会说为什么会这样是显而易见的。有趣的问题!

关于java - Java 中的@Override 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24193027/

相关文章:

android - Retrofit 接口(interface)中 Call 和 Observable Response 的区别

java - Hibernate 在更新父对象时不更新子对象

java - 为什么Java允许子类重新定义方法的返回类型?

java - 为什么 Java 8 的注解类型中不允许使用默认方法?

interface - 强制转换为接口(interface)和契约(Contract)实例之间有区别吗?

java - Annotation Bind Time(Java中什么时候绑定(bind)注解)

struts2 - Tiles 与 Struts 2 注释集成

java - 如何修复 : Embedded H2 Database "NonTransientError: Unable to read the page at position" error?

java - 如何通过命令行向服务器发出命令

java - 如何以可靠的方式编写/更新 Oracle blob?