javaが修飾子の代わりに@Overrideアノテーションを使用するのはなぜですか?


19

@Override新しいoverride修飾子を作成する代わりに、Javaが注釈を使用する動機は何ですか?

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

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

2
それは再考されました。
Tulainsコルドバ

回答:


21

@Overrideはもともと言語ではありませんでした。それを追加する必要性が感じられたとき、言語に新しいキーワードを追加するよりも一般的なメカニズム(注釈)を使用する方が簡単でした。新しいキーワードを追加すると、その単語を識別子として使用するプログラムが破損する可能性があるため、常に互換性のない変更です。

初日からオーバーライドマーカーを追加する言語では、キーワード(キーワードはKotlinやScalaなど)であることが非常に多いため、Javaでは、オーバーライドマーカーのない古いJavaバージョンとの下位互換性を維持する必要がありました。


新しいキーワードが導入された変更があった場合、オーバーライドが注釈であるとは一貫していないようです。たとえば、インターフェイスメソッドの「デフォルト」修飾子。
jwa

6
@jwa実際はそうでdefaultはありません:既に予約済みのキーワード(switchステートメントで使用)でした-新しい使用法を追加しただけです。(定数、後藤)があり、今何もしないいくつかのキーワードでもありますが、将来の使用のために予約されている-を参照してJLS§3.9
のMichałKosmulski

3
「例はKotlinとJavaです」はここではタイプミスのように見えますが、Javaの代わりにScalaなどを書くつもりでしたか?
-gnat

6
グローバルキーワードを追加すると問題が発生するのは事実ですが、コードを壊すことなくコンテキストキーワードとして追加することもできます。解析が少し複雑になり、注釈メカニズムが十分に良かったので、これは行われなかったと想定します
jk。

1
@MichałKosmulski:enum追加されたキーワードが古いコードを壊すことを覚えています。ここでさらに破壊的なキーワード:stackoverflow.com/questions/16506411
Allon Guralnek

13

実際に動作をオーバーライドするために@Overrideアノテーションは必要ありません。メソッド自体を変更するのではなく、単にメソッドの意図のコンテキストをコンパイラに追加するだけなので、これは注釈です。

アノテーションがなければ、機能をオーバーライドしようとするかもしれませんが、誤ってそうすることに失敗します(わずかに異なる署名を使用することによって)。アノテーションを追加すると、このメソッドが実際に動作をオーバーライドしていない場合、エラーを生成するようコンパイラーに指示します。

そのため、注釈として完全に理にかなっています。


+1注釈による警告を無効にするのと同様に、注釈によるオプションの警告/エラーを有効にすることもできます。
ハルク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.