为什么Java使用@Override注释而不是修饰符?


19

Java使用@Override注释而不是创建新override修饰符的动机是什么?

@Override
public String toString() {
   return "";
}

public override String toString() {
   return "";
}

2
那是事后的想法。
图兰斯·科尔多瓦

Answers:


21

@Override最初不是使用该语言编写的。当需要添加它时,使用通用机制(注释)要比向语言添加新关键字要容易得多。添加新关键字始终是不兼容的更改,因为它可能破坏使用该单词作为标识符的程序。

从一开始就添加了覆盖标记的语言中,通常是一个关键字(例如Kotlin和Scala),而在Java中,这是与没有任何覆盖标记的Java版本保持向后兼容的问题。


当发生了引入新关键字的更改时,覆盖似乎是不一致的。例如,接口方法的“默认”修饰符。
jwa

6
@jwa并非如此:default已经是保留关键字(在switch语句中使用)-他们只是为其添加了新用法。还有一些关键字目前不执行任何操作,但保留以备将来使用(const,goto)-参见JLS§3.9
MichałKosmulski,

3
“示例是Kotlin和Java”在这里看起来像是一个错字,您的意思是编写例如Scala而不是Java吗?
蚊蚋

6
虽然添加全局关键字确实会破坏东西,但可以将其作为上下文关键字添加而不会破坏代码。有人认为这样做没有做,因为它会使解析复杂化,并且注释机制足够好
jk。

1
@MichałKosmulski:我记得enum添加的关键字会破坏旧代码。此处还有更多突破性的关键字:stackoverflow.com/questions/16506411
Allon Guralnek '16年

13

您不需要@Override批注实际覆盖行为。这是一个注释,因为它只是为编译器添加了方法意图的某些上下文,而没有更改方法本身。

如果没有注释,您可能打算覆盖功能,但是偶然地失败了(通过使用稍微不同的签名)。如果此方法实际上未覆盖行为,则添加注释将告知编译器生成错误。

因此,将其作为注释非常有意义。


+1有道理,类似于通过注释禁用警告,也可以通过注释启用可选的警告/错误。
绿巨人
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.