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

StackOverflow https://stackoverflow.com/questions/212614

質問

インターフェイスメソッドを実装するメソッドに @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 注釈を表示することをお勧めします。

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 メソッドの実装には適していません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top