当我在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注释,在从接口实现方法的情况下,等等。)
答案 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
适用于重写方法,无论它们在技术上是实现还是“真正”被覆盖。为什么要为自己(和编译器设计者)做更多的工作呢?
我知道这对继承如何运作有一个相当糟糕的看法,但我希望它有意义。
所以我想最后,我会说你错了。 覆盖完成。但我不会说这就是为什么会出现这种情况。有趣的问题!