例如,当我用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中实现接口并实现接口中的方法会引入@重写注释。这不完全是个用词不当吗?
这个注释不应该被称为"@Implementation“吗?
@重写注释更适合用于实际覆盖预定义的超类方法的子类。在简单地从接口实现方法的情况下,没有实际的重写操作。
我说的对吗?
(如果我是Java 9的JLS编写者,我将有一个名为@Implementation的新注释,在从接口实现方法的情况下,该注释将“子类”@重写注释,等等)。
发布于 2014-06-12 20:14:42
看看JLS,它似乎就是它的定义。我正在查看JLS 8,不确定我将要引用的部分在早期版本中是否不同(尽管我对它有很大的怀疑,因为界面交互不应该改变)。第8.4.8.1节:
在类C中声明或继承的实例方法mC,从C重写接口I中声明的另一个方法mI,当且仅当以下所有内容都是正确的:
因此,至少基于这一点,@Override注释是有意义的,因为它表示一个实例方法,它根据JLS中的定义覆盖接口中声明的方法。
不幸的是,我无法给出一个权威的答案,为什么这被称为“压倒一切”,但在我的脑海中,它是如何工作的:
如果继承了abstract方法(如接口中的方法),那么类将隐式地包含该方法的主体签名。当您实现与该签名相对应的方法时,您将继承的抽象方法签名替换(从而覆盖)一个与具体实现相对应的签名。所以有@Override是有意义的,对吧?
此外,通过这种方式,@Override将适用于重写的方法,而不管它们在技术上是实现还是“真正”重写。为什么要为自己(和编译器设计者)做比你必须做的更多的工作呢?
我知道,对于继承的工作方式,这是一个相当糟糕的观点,但我希望这是有意义的。
所以我想在最后,我会说你错了。正在进行压倒一切的工作。但我不会马上说清楚为什么会这样。有趣的问题!
https://stackoverflow.com/questions/24193027
复制相似问题