web-dev-qa-db-ja.com

インターフェースのメソッド実装を@Overrideするべきですか?

インターフェースメソッドを実装するメソッドに@Overrideのアノテーションを付ける必要がありますか?

Overrideアノテーションのjavadoc はこう言います:

メソッド宣言がスーパークラスのメソッド宣言をオーバーライドすることを意図していることを示します。メソッドがこの注釈型で注釈されていてもスーパークラスのメソッドをオーバーライドしない場合、コンパイラはエラーメッセージを生成する必要があります。

私はインターフェースが技術的にスーパークラスだとは思わない。またはそれは?

Question Elaboration

403
Benno Richters

可能な限り@Overrideを使用してください。単純な間違いが行われるのを防ぎます。例:

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

public boolean equals(Object obj) を正しく上書きしないため、これはコンパイルされません。

インターフェースを実装するメソッド(1.6以上)、またはスーパークラスのメソッドをオーバーライドするメソッドについても同じことが言えます。

284
jjnguy

私はjavacの振る舞いが変わったと思います - 1.5ではアノテーションが禁止され、1.6ではそうではありません。アノテーションは余分なコンパイル時チェックを提供します、それであなたが1.6を使っているなら私はそれのために行きます。

100
Jon Skeet

可能であれば、メソッドには常に@Overrideというアノテーションを付けるべきです。

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

equals(Object)equals(YourObject)の例はその典型的な例ですが、インターフェースの実装についても同じことが言えます。

インタフェースの実装メソッドに注釈をつけることが必須ではないのは、JDK 5がこれをコンパイルエラーとして報告したからです。 JDK 6でこのアノテーションを必須にした場合、後方互換性が損なわれます。

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

しかし、私はこの使用法のための別のアノテーション、おそらく@Implementsアノテーションを見た方がいいでしょう。

58
GKelly

私はあらゆる機会にそれを使うでしょう。 いつJavaの@Overrideアノテーションを使うのですか?そしてその理由は? を参照してください。

15
Alex B

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

11
Silent Warrior

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

3
lwpro2

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

3
Arne Burmeister

具象クラスがオーバーライド抽象メソッドではない場合、実装@Overrideを使用することは未解決の問題です。メソッドこのような場合は、読みやすさを損なうような議論をすることができます。それはあなたのコードで読むべきことであり、それほどではありませんが、@Overrideではなく@Implementと呼ばれます。

3
juanchito

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

2
Fabian Steeg

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

1

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

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

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

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

1
Zhao Pengfei

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

しかし、私はそれが理にかなっているとは思わない:オーバーライドはあなたがスーパークラスのメソッドを持つことを意味し、あなたはサブクラスでそれを実装しています。

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

1
ZhaoGang

@Overrideをインクルードすることの問題は、super.theOverridenMethod()メソッドを呼び出すのを忘れたと思わせるということです。これは非常に分かりにくいです。これは明確なはずです。おそらく、Javaはここで使用される@Interfaceを提供するべきです。まあ、それでももう1つの半ばJava特色...

1
spujia

インターフェースでは、@ 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
Park JongBum

interfaceを実装しているクラスがabstractクラスである場合、@Overrideはその実装がinterfaceメソッド用であることを確認するのに役立ちます。 @Overrideがなければ、実装メソッドのシグネチャがabstractで宣言されたメソッドと一致しない場合でも、interfaceクラスは問題なくコンパイルされます。不一致のinterfaceメソッドは未実装のまま残ります。 @ Zhaoによって引用されたJavaドキュメント

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

は明らかにabstractスーパークラスを参照しています。 interfaceをスーパータイプと呼ぶことはできません。そのため、@Overrideは冗長であり、具象クラスのinterfaceメソッドの実装には意味がありません。

0
Madhu