インターフェイスのメソッド実装を@Overrideする必要がありますか?
-
03-07-2019 - |
質問
インターフェイスメソッドを実装するメソッドに @Override
の注釈を付ける必要がありますか?
メソッド宣言がスーパークラスのメソッド宣言をオーバーライドすることを意図していることを示します。メソッドがこの注釈タイプで注釈付けされているが、スーパークラスメソッドをオーバーライドしない場合、コンパイラはエラーメッセージを生成する必要があります。
インターフェイスは技術的にはスーパークラスだとは思いません。それともそれですか?
解決
可能な限り@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では許可されています。そのため、要件に応じてプロジェクト設定を構成できる場合があります。
通常、独自のクラスから継承した独自のメソッドをオーバーライドしても、ideを使用したリファクタリングは中断されません。ただし、ライブラリから継承したメソッドをオーバーライドする場合は、使用することをお勧めします。しないと、その後のライブラリの変更でエラーが発生することはほとんどありませんが、隠れたバグが発生します。
JDKの問題ではありません。 Eclipse Heliosでは、実装されたインターフェイスメソッド(JDK 5または6のいずれか)に対して@Overrideアノテーションを許可します。EclipseGalileoに関しては、@ OverrideアノテーションはJDK 5または6のいずれかを許可されません。
具象クラスが抽象メソッドをオーバーライドしていない場合、実装に @Override
を使用することはオープンですコンパイラーは未実装のメソッドについて常に警告を出すので問題です。これらの場合、読みやすさを損なうという議論を行うことができます。コードを読むことのほうが多く、程度は低いですが、 @ではなく
。 @Override
と呼ばれます。実装
私にとって、これがコードのコンパイルにJava 6を必要とする唯一の理由であることがよくあります。価値があるかどうかわからない。
Eclipse自体は、「実装されていないメソッドを生成」するように指示すると、 @Override
注釈を追加します。インターフェースを実装するクラスの作成中。
@Override
を含めることの問題は、 super.theOverridenMethod()
メソッドを呼び出すのを忘れたと思わせることです。 。これは明確なはずです。おそらく、Javaはここで使用する @Interface
を提供する必要があります。まあ、まだ別の半分ばかげたJavaの特殊性...
Java 6以降のバージョンでは、インターフェイスを実装するメソッドに @Override
を使用できます。
しかし、私はそれが意味をなさないと思います:オーバーライドは、スーパークラスのメソッドをhavaし、サブクラスでそれを実装していることを意味します。
インターフェイスを実装する場合、 @Implement
または他の何かを使用する必要がありますが、 @Override
は使用しないでください。
java8のjavadocを読むと、オーバーライドの宣言で次のことがわかります。
この注釈タイプでメソッドに注釈が付けられている場合、次の条件の少なくとも1つが成り立たない限り、コンパイラはエラーメッセージを生成する必要があります。
- メソッドは、スーパータイプで宣言されたメソッドをオーバーライドまたは実装します。
- メソッドには、{@ linkplain Object}で宣言されたパブリックメソッドのオーバーライドと同等の署名があります。
したがって、少なくともjava8では、インターフェイスメソッドの実装で@Overrideを使用する必要があります。
インターフェイスでは、@ Overrideを使用するとコンパイルエラーが発生しました。 そのため、削除する必要がありました。
エラーメッセージが送信されました" InMemoryProductRepository型のgetAllProducts()メソッドは、スーパークラスメソッドをオーバーライドする必要があります
"。
また、" 利用可能な1つの簡単な修正:@Overrideアノテーションを削除します。
"
Eclipse 4.6.3、JDK 1.8.0_144にありました。
interface
を実装しているクラスが abstract
クラスである場合、 @Override
は、 @Override
が< code> interface メソッド; @Override
がなければ、実装メソッドのシグネチャが interface
で宣言されたメソッドと一致しない場合でも、 abstract
クラスは正常にコンパイルされます。不一致の interface
メソッドは未実装のままになります。
@Zhaoが引用したJavaドキュメント
メソッドは、スーパータイプで宣言されたメソッドをオーバーライドまたは実装します
は明らかに abstract
スーパークラスを参照しています。 interface
をスーパータイプと呼ぶことはできません。
そのため、 @Override
は冗長であり、具象クラスの interface
メソッドの実装には適していません。