Java中的@Override注释

Ale*_*lls 5 java overriding annotations interface

当我在Java中实现接口时,例如:

public interface IColumnHeader {

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

}
Run Code Online (Sandbox Code Playgroud)

以下枚举实现了上面的接口:

public enum FileColumnDwellTime implements IColumnHeader {

    REPORTER_USER_ID {

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

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

}
Run Code Online (Sandbox Code Playgroud)

为什么在Java中实现接口并从接口实现方法会引入@Override注释.这不是一个用词不当吗?

那个注释实际上不应该被称为"@Implementation"吗?

@Override注释更适用于实际覆盖预定义的超类方法的子类.在简单地从接口实现方法的情况下,没有实际的重写.

我对吗?

(如果我是Java 9的JLS编写器,我将有一个名为@Implementation的新注释,它将"子类化"@Override注释,在从接口实现方法等的情况下.)

awk*_*ksp 4

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

\n\n
\n

在类 C 中声明或继承的实例方法 mC会覆盖在接口 I 中声明的另一个 C 方法 mI,当且仅当满足以下所有条件时:

\n\n
    \n
  • I是C的超级接口。
  • \n
  • mI 是一个抽象或默认方法。
  • \n
  • mC 的签名是 mI 签名的子签名 (\xc2\xa78.4.2)。
  • \n
\n
\n\n

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

\n\n
\n\n

不幸的是,我无法给出一个权威的答案来解释为什么这被称为重写,但它在我的脑海中是如何工作的:

\n\n

如果您继承一个abstract方法(例如接口中的方法),则您的类将在其主体中隐式包含该方法的签名。当您实现与该签名相对应的方法时,您可以将继承的抽象方法签名替换为与具体实现相对应的方法签名(从而覆盖)。所以拥有 是有意义的@Override,对吧?

\n\n

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

\n\n

我知道这对于继承的工作原理来说是一个相当糟糕的观点,但我希望它是有道理的。

\n\n
\n\n

所以我想最后我会说你错了。正在做压倒一切的事情但我不会说为什么会出现这种情况是显而易见的。有趣的问题!

\n