Java中的@Override注释

时间:2014-06-12 20:03:05

标签: java interface annotations override

当我在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注释,在从接口实现方法的情况下,等等。)

1 个答案:

答案 0 :(得分:4)

看一下JLS,它似乎就是如何定义的。我正在研究JLS 8,不确定我要引用的部分在早期版本中是否有所不同(尽管我非常怀疑它会,因为接口交互不应该改变)。从第8.4.8.1节:

  

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

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

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


不幸的是,我无法给出为什么这称为覆盖的权威性答案,但这里有一些如何在我脑海中起作用:

如果继承了abstract方法(如界面中的方法),则您的类隐式包含该方法在其正文中的签名。当您实现与该签名对应的方法时,将替换(并因此覆盖)继承的抽象方法签名替换为对应于具体实现的签名。那么有@Override,对吗?

是有意义的

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

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


所以我想最后,我会说你错了。 覆盖完成。但我不会说这就是为什么会出现这种情况。有趣的问题!