首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@重写Java注释

@重写Java注释
EN

Stack Overflow用户
提问于 2014-06-12 20:03:05
回答 1查看 3.2K关注 0票数 5

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

代码语言:javascript
复制
public interface IColumnHeader {

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

}

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

代码语言:javascript
复制
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中实现接口并实现接口中的方法会引入@重写注释。这不完全是个用词不当吗?

这个注释不应该被称为"@Implementation“吗?

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

我说的对吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-12 20:14:42

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

在类C中声明或继承的实例方法mC,从C重写接口I中声明的另一个方法mI,当且仅当以下所有内容都是正确的:

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

因此,至少基于这一点,@Override注释是有意义的,因为它表示一个实例方法,它根据JLS中的定义覆盖接口中声明的方法。

不幸的是,我无法给出一个权威的答案,为什么这被称为“压倒一切”,但在我的脑海中,它是如何工作的:

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

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

我知道,对于继承的工作方式,这是一个相当糟糕的观点,但我希望这是有意义的。

所以我想在最后,我会说你错了。正在进行压倒一切的工作。但我不会马上说清楚为什么会这样。有趣的问题!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24193027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档