インターフェースメソッドを実装するメソッドに@Override
のアノテーションを付ける必要がありますか?
Override
アノテーションのjavadoc はこう言います:
メソッド宣言がスーパークラスのメソッド宣言をオーバーライドすることを意図していることを示します。メソッドがこの注釈型で注釈されていてもスーパークラスのメソッドをオーバーライドしない場合、コンパイラはエラーメッセージを生成する必要があります。
私はインターフェースが技術的にスーパークラスだとは思わない。またはそれは?
可能な限り@Overrideを使用してください。単純な間違いが行われるのを防ぎます。例:
class C {
@Override
public boolean equals(SomeClass obj){
// code ...
}
}
public boolean equals(Object obj)
を正しく上書きしないため、これはコンパイルされません。
インターフェースを実装するメソッド(1.6以上)、またはスーパークラスのメソッドをオーバーライドするメソッドについても同じことが言えます。
私はjavacの振る舞いが変わったと思います - 1.5ではアノテーションが禁止され、1.6ではそうではありません。アノテーションは余分なコンパイル時チェックを提供します、それであなたが1.6を使っているなら私はそれのために行きます。
可能であれば、メソッドには常に@Override
というアノテーションを付けるべきです。
JDK 5ではこれはスーパークラスのメソッドをオーバーライドすることを意味し、JDK 6、7ではスーパークラスのメソッドをオーバーライドすること、およびインタフェースのメソッドを実装することを意味します。その理由は、前述したように、メソッドをオーバーライド(または実装)していると思われるが、実際には新しいメソッドを定義している(異なるシグネチャ)場合に、コンパイラーがエラーを検出できるようにするためです。
equals(Object)
対equals(YourObject)
の例はその典型的な例ですが、インターフェースの実装についても同じことが言えます。
インタフェースの実装メソッドに注釈をつけることが必須ではないのは、JDK 5がこれをコンパイルエラーとして報告したからです。 JDK 6でこのアノテーションを必須にした場合、後方互換性が損なわれます。
私はEclipseユーザーではありませんが、他のIDE(IntelliJ)では、プロジェクトがJDK 6+プロジェクトとして設定されている場合に@Override
アノテーションがインターフェースメソッドを実装するときにのみ追加されます。私はEclipseが似ていることを想像するでしょう。
しかし、私はこの使用法のための別のアノテーション、おそらく@Implements
アノテーションを見た方がいいでしょう。
私はあらゆる機会にそれを使うでしょう。 いつJavaの@Overrideアノテーションを使うのですか?そしてその理由は? を参照してください。
インタフェースで宣言されたメソッド(そのコンパイルエラー)を実装している場合、JDK 5.0では@Override
アノテーションを使用できませんが、JDK 6.0では許可されています。それであなたはあなたの要求に従ってあなたのプロジェクト好みを構成することができるかもしれません。
JDKでは問題ありません。 Eclipse Heliosでは、実装されたインターフェース・メソッドに対して、JDK 5または6のどちらでも@Overrideアノテーションを使用できます。EclipseGalileoの場合、@ Overrideアノテーションは、JDK 5または6のどちらでも使用できません。
あなた自身のクラスから継承されたあなた自身のメソッドをオーバーライドしても、通常はideを使ったリファクタリングを中断しません。ただし、ライブラリから継承したメソッドをオーバーライドする場合は、それを使用することをお勧めします。あなたがしなくても、後のライブラリの変更でエラーにはならないことが多いでしょうが、よく隠されたバグです。
具象クラスがオーバーライド抽象メソッドではない場合、実装に@Override
を使用することは未解決の問題です。メソッドこのような場合は、読みやすさを損なうような議論をすることができます。それはあなたのコードで読むべきことであり、それほどではありませんが、@Override
ではなく@Implement
と呼ばれます。
私にとっては、多くの場合、これが一部のコードでJava 6のコンパイルを要求する唯一の理由です。それが価値があるかどうかわからない。
インターフェースを実装するクラスの作成中に「実装されていないメソッドを生成する」ように指示すると、Eclipse自体が@Override
アノテーションを追加します。
Java8のjavadocを読むと、Overrideインターフェースの宣言で次のことがわかります。
メソッドにこのアノテーションタイプのアノテーションが付けられている場合、次の条件の少なくとも1つが成り立たない限り、エラーメッセージを生成するためにコンパイラが必要です。
そのため、少なくともJava 8では、インタフェースメソッドの実装に@Overrideを使用する必要があります。
Java 6以降のバージョンでは、インターフェースを実装するメソッドに@Override
を使用できます。
しかし、私はそれが理にかなっているとは思わない:オーバーライドはあなたがスーパークラスのメソッドを持つことを意味し、あなたはサブクラスでそれを実装しています。
あなたがインターフェースを実装しているなら、私たちは@Implement
か何か他のものを使うべきだと思いますが、@Override
を使うべきではありません。
@Override
をインクルードすることの問題は、super.theOverridenMethod()
メソッドを呼び出すのを忘れたと思わせるということです。これは非常に分かりにくいです。これは明確なはずです。おそらく、Javaはここで使用される@Interface
を提供するべきです。まあ、それでももう1つの半ばJava特色...
インターフェースでは、@ 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上にありました。
interface
を実装しているクラスがabstract
クラスである場合、@Override
はその実装がinterface
メソッド用であることを確認するのに役立ちます。 @Override
がなければ、実装メソッドのシグネチャがabstract
で宣言されたメソッドと一致しない場合でも、interface
クラスは問題なくコンパイルされます。不一致のinterface
メソッドは未実装のまま残ります。 @ Zhaoによって引用されたJavaドキュメント
このメソッドは、スーパータイプで宣言されたメソッドをオーバーライドまたは実装します。
は明らかにabstract
スーパークラスを参照しています。 interface
をスーパータイプと呼ぶことはできません。そのため、@Override
は冗長であり、具象クラスのinterface
メソッドの実装には意味がありません。