インターフェースのメソッド実装を@オーバーライドする必要がありますか?


432

インターフェイスメソッドを実装するメソッドに注釈を付ける必要があり@Overrideますか?

javadocのOverride注釈は言います:

メソッド宣言がスーパークラスのメソッド宣言をオーバーライドすることを目的としていることを示します。メソッドにこのアノテーションタイプでアノテーションが付けられているが、スーパークラスメソッドをオーバーライドしない場合、コンパイラーはエラーメッセージを生成する必要があります。

インターフェイスは厳密にはスーパークラスだとは思いません。またはそれは?

Question Elaboration


5
うわー、この質問はもっと短いかもしれませんが、私が必要とした質問です。ありがとう
Dan Rosenstark

1
@Overrideの記事に代わるものが見つかりません(Oracleは最近、古いSunのブログを移動しました)。それを見つける方法を知っていますか?
リザードの請求

4
@Implement(s)アノテーションが今(2015年)までにあるはずです。それは物事を明確にするでしょう!
アレックス、

3
今(2015)までに、Java 8で@Overrideを使用する必要がありますか?
Lorenzo Sciuto

回答:


305

可能な限り@Overrideを使用してください。簡単な間違いを防ぐことができます。例:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

これは適切にオーバーライドされないため、コンパイルされませんpublic boolean equals(Object obj)

インターフェイスを実装するメソッドについても同様です( 1.6以上のみ)またはスーパークラスのメソッドをオーバーライドするです。


150
Java 5のインターフェースを実装するメソッドに@Overrideアノテーションを追加できないことに注意してください。エラーが発生します。これはJava 6で許可されています
ビルミシェル

17
ええと、そうではありません。実際、Eclipseは、インターフェースを実装するメソッドを入力するときに@Overrideを自動挿入します。
jjnguy

14
回答がインターフェイスメソッドの実装に関してJava 1.5から1.6への異なる動作についての言及を含むまで、-1。私がそれを人々にとって混乱させる側面であると見たからといって、それは本当に言及に値する。
Grundlefleck、2010年

2
Eclipseが不平を言っている場合は、ur jdkを> 1.5にアップグレードし、コンパイラー準拠レベルを1.6または1.7に変更してください。これを行うには、urプロジェクト->プロパティ-> Javaコンパイラを右クリックし、1.5より大きいものを選択します。
ローズ

1
誰かが実際に答えを正当化する例(ベースメソッドをオーバーライドするのではなく、インターフェースを実装する)を思いつくことができますか?私にとっての大きなプラスは、特定の方法がどのようにどのように使用されるかについて読者の期待を設定するのに役立つことです。
Joe Lee-Moyet、2014年

103

私はjavacの動作が変更されたと思います-1.5ではアノテーションを禁止しましたが、1.6では禁止しませんでした。アノテーションは追加のコンパイル時チェックを提供するため、1.6を使用している場合はそれを使用します。


1
追加チェックとは何ですか?
マイケルカーマン

17
@Michaelインターフェースが削除されたかどうかを確認できます。
Sanghyun Lee

68

@Override使用できる場合は、常にメソッドに注釈を付ける必要があります。

これは、JDK 5ではスーパークラスのメソッドをオーバーライドすることを意味し、JDK 6および7では、スーパークラスのメソッドをオーバーライドし、インターフェースのメソッドを実装することを意味します。前述のように、その理由は、メソッドをオーバーライド(または実装)していると思われるが、実際には新しいメソッド(異なるシグネチャ)を定義しているとコンパイラがエラーをキャッチできるようにするためです。

equals(Object)対のequals(YourObject)例は点で標準的なケースであるが、同じ引数は、インターフェイスの実装のために行うことができます。

インターフェイスの実装メソッドに注釈を付けることが必須ではない理由は、JDK 5がこれをコンパイルエラーとしてフラグを付けたためだと思います。JDK 6がこのアノテーションを必須にした場合、下位互換性が失われます。

私はEclipseユーザーではありませんが、他のIDE(IntelliJ)では、 @Override、プロジェクトがJDK 6+プロジェクトとして設定されている場合、インターフェースメソッドの実装時にのみアノテーションが追加されます。私はEclipseが似ていると想像します。

ただし、この使用法には別の注釈、おそらく注釈を表示することをお勧めし@Implementsます。



11

JDK 5.0では@Override、インターフェースで宣言されたメソッドを実装している場合(そのコンパイルエラー)、アノテーションを使用できませんが、JDK 6.0では許可されています。したがって、要件に応じてプロジェクト設定を構成できる場合があります。


4

具象クラスが抽象メソッドをオーバーライドしない場合、コンパイラーは常に実装されていないメソッドについて警告する@Overrideため、実装に使用することは未解決の問題です。これらの場合、可読性を損なうという議論が生じる可能性があります-コードで読むことは多く、それほどでは@Overrideありませんが、呼び出されるのではなく呼び出され@Implementます。


3

独自のクラスから継承された独自のメソッドをオーバーライドしても、通常、IDEを使用したリファクタリングが中断することはありません。ただし、ライブラリから継承したメソッドをオーバーライドする場合は、それを使用することをお勧めします。そうしないと、後でライブラリを変更してもエラーは発生しませんが、よく隠されたバグになります。


3

JDKでは問題ありません。Eclipse Heliosでは、実装されたインターフェースメソッドに対して@OverrideアノテーションをJDK 5または6のいずれかで許可します。EclipseGalileoについては、@ OverrideアノテーションはJDK 5または6のどちらでも許可されません。


2

私にとって、多くの場合、これは、一部のコードのコンパイルにJava 6が必要な唯一の理由です。それが価値があるかどうかわからない。


2

java8でjavadocを読むと、Overrideインターフェースの宣言で次のことがわかります。

メソッドにこのアノテーションタイプのアノテーションが付けられている場合、次の条件の少なくとも1つが満たされない限り、コンパイラーはエラーメッセージを生成する必要があります。

  • メソッドは、スーパータイプで宣言されたメソッドをオーバーライドまたは実装します。
  • メソッドには、{@ linkplain Object}で宣言されたすべてのパブリックメソッドのオーバーライドと同等の署名があります。

したがって、少なくともjava8では、インターフェースメソッドの実装で@Overrideを使用する必要があります。


1

@Overrideインターフェースを実装するクラスの作成中に「実装されていないメソッドを生成する」ように指示すると、Eclipse自体が注釈を追加します。


1

を含めることの問題@Overrideは、super.theOverridenMethod()メソッドを呼び出すのを忘れたように思わせることで、これは非常に混乱します。これは非常に明確なはずです。おそらく、Javaは@Interfaceここで使用するを提供する必要があります。ああ、もう1つの半口Javaの特徴...


3
インターフェースを実装していないときのスーパーの呼び出しは、常に実行する必要がある、または実行したくないものではありません。場合によっては、機能を追加することもあります。また、機能を置き換えるため、呼び出さない場合もあります。API作成者は、内部機能に依存しているかどうかを文書化し、クラスを適切に拡張する方法について文書化された契約を作成する必要があります。
リルバーディー2014年

1

Java 6以降のバージョンでは@Override、インターフェースを実装するメソッドに使用できます。

しかし、私はそれが理にかなっているとは思いません。オーバーライドとは、スーパークラスにメソッドを置き、サブクラスにそれを実装することを意味します。

あなたがインターフェースを実装しているなら、私たちは@Implement何か他のものを使うべきだと思いますが、ではありません@Override


0

インターフェイスでは、@ Overrideを使用するとコンパイルエラーが発生しました。それで、私はそれを取り除かなければなりませんでした。

エラーメッセージが " The method getAllProducts() of type InMemoryProductRepository must override a superclass method"になりました。

One quick fix available: Remove @Override annotation.」も読む

それはEclipse 4.6.3、JDK 1.8.0_144にありました。


0

実装されたクラスが場合interfaceであるabstractクラスは、@Override実装がためであることを保証するのに有用であるinterface方法。なし クラスがちょうど方法と一致していない実装メソッドシグネチャがで宣言された場合でも、罰金コンパイルします。一致しないメソッドは実装されないままになります。@Zhaoが引用するJavaドキュメント@Overrideabstractinterfaceinterface

メソッドは、スーパータイプで宣言されたメソッドをオーバーライドまたは実装します

明確に言及している abstractスーパークラスます。interfaceスーパータイプと呼ばれることはできません。したがって、これ@Overrideは冗長でありinterface、具象クラスでのメソッド実装には適していません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.