Ale*_*lls 5 java overriding annotations interface
当我在Java中实现接口时,例如:
public interface IColumnHeader {
public String getHeaderValue();
public String findColumnValueFromHeaderValue(String parseFrom);
}
Run Code Online (Sandbox Code Playgroud)
以下枚举实现了上面的接口:
public enum FileColumnDwellTime implements IColumnHeader {
REPORTER_USER_ID {
@Override
public String getHeaderValue() {
return "reporter_user_id";
}
@Override
public String findColumnValueFromHeaderValue(String parseFrom) {
return parseFrom;
}
};
}
Run Code Online (Sandbox Code Playgroud)
为什么在Java中实现接口并从接口实现方法会引入@Override注释.这不是一个用词不当吗?
那个注释实际上不应该被称为"@Implementation"吗?
@Override注释更适用于实际覆盖预定义的超类方法的子类.在简单地从接口实现方法的情况下,没有实际的重写.
我对吗?
(如果我是Java 9的JLS编写器,我将有一个名为@Implementation的新注释,它将"子类化"@Override注释,在从接口实现方法等的情况下.)
看看 JLS,它似乎就是这样定义的。我正在查看 JLS 8,不确定我要引用的部分在早期版本中是否有所不同(尽管我非常怀疑它会有所不同,因为界面交互不应该改变)。来自第 8.4.8.1 节:
\n\n\n\n\n在类 C 中声明或继承的实例方法 mC会覆盖在接口 I 中声明的另一个 C 方法 mI,当且仅当满足以下所有条件时:
\n\n\n
\n- I是C的超级接口。
\n- mI 是一个抽象或默认方法。
\n- mC 的签名是 mI 签名的子签名 (\xc2\xa78.4.2)。
\n
因此,至少基于此,@Override
注释是有意义的,因为它表示基于 JLS 中的定义重写接口中声明的方法的实例方法。
不幸的是,我无法给出一个权威的答案来解释为什么这被称为重写,但它在我的脑海中是如何工作的:
\n\n如果您继承一个abstract
方法(例如接口中的方法),则您的类将在其主体中隐式包含该方法的签名。当您实现与该签名相对应的方法时,您可以将继承的抽象方法签名替换为与具体实现相对应的方法签名(从而覆盖)。所以拥有 是有意义的@Override
,对吧?
此外,这种方式@Override
适用于重写的方法,无论它们在技术上是实现还是“真正”重写。为什么要为自己(和编译器设计者)做更多的工作呢?
我知道这对于继承的工作原理来说是一个相当糟糕的观点,但我希望它是有道理的。
\n\n所以我想最后我会说你错了。正在做压倒一切的事情。但我不会说为什么会出现这种情况是显而易见的。有趣的问题!
\n 归档时间: |
|
查看次数: |
2885 次 |
最近记录: |