【问题标题】:@Override annotation in JavaJava中的@Override注解
【发布时间】:2014-06-12 20:03:05
【问题描述】:

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

public interface IColumnHeader {

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

}

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

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 中实现接口并从接口实现方法会引入 @Override 注解。这不是用词不当吗?

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

@Override 注释将更适合实际上覆盖预定义超类方法的子类。在简单地从接口实现方法的情况下,不会进行实际的覆盖。

我说的对吗?

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

【问题讨论】:

  • 嗯,@Override是在JLS中定义的,所以现在改有点晚了..."实现在超类型中声明的方法,或者不覆盖 - 等效于 Object 的公共方法,则会发生编译时错误。”不过,不确定为什么只选择了一个注释。可能是为了简单?
  • 那是那个接口的合约。并覆盖作为编译时保护
  • 如果它让您对命名更满意,那么在 Java 8 中,您实际上可以在接口中实现,然后您确实可以覆盖这些实现。当然,@Override 注释比 Java 8 早得多,但你去吧。 ;-)
  • 这个问题并不是真正特定于接口的。可以有抽象类方法和具体接口方法。

标签: java interface annotations overriding


【解决方案1】:

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

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

  • I 是 C 的超接口。
  • mI 是一种抽象或默认方法。
  • mC 的签名是 mI 签名的子签名 (§8.4.2)。

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


不幸的是,我无法给出关于为什么这被称为压倒一切的权威答案,但这是我脑海中的一种运作方式:

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

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

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


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

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 2010-09-10
    • 2016-10-29
    • 1970-01-01
    • 2023-03-06
    • 2013-07-20
    • 1970-01-01
    相关资源
    最近更新 更多