Java 1.6 以降では、 @Override を使用して、インターフェースで定義されたメソッドの実装をマークできます。私は体系的に使用するその注釈を持つことの価値を理解しています。しかし、インターフェイスはコントラクトを定義するだけで、デフォルトの実装を提供しないため、一体何を「オーバーライド」する必要があるのか を誰かが説明できますか?
3 に答える
はい、オーバーライドするものは何もありません。唯一のもっともらしい説明は、これが慣習の派生物であったということです。
インターフェイスを実装するクラスのコンテキストでは、とにかくすべてのインターフェイス メソッドのコードを記述し損ねるとコンパイラが叫ぶので、これは実際には必要ありません。この設定では、注釈はコメントと同じようにマーカーのように機能します。
また、インターフェース関連の場合、IDE は @Override を自動生成されたクイックフィックス メソッド スタブに含めるのをやめるべきです。
さらに、インターフェース メソッドの実装で @Override アノテーションが使用されている場合は、「未使用」コードの警告を生成する必要があります。
意味的には、インターフェイスをまったく別のものではなく、一種の空の基本クラスと見なす場合にのみ意味があります。そして歴史的に、これは実際にインターフェイスの概念の起源です。C++ は、"インターフェイス" というネイティブの概念を持たない言語でしたが、単一のクラスに複数の基底クラスを与えることをサポートしていました。この言語を使用した多くの人々は、複数の基本クラスを持つことは扱いにくすぎて役に立たないと感じていました。ただし、実装がまったくなく、メソッド定義のみの基本クラスの場合は例外です。Java などのその後の言語は、インターフェイスのみの基本クラスの概念を形式化しました。
こんな場面で重宝しそうです。
interface Goable {
void go(Location loc);
}
class Vehicle implements Goable {
void go() {
...
}
void go(Location loc) {
...
}
}
クラス Vehicle では、@Overrideを使用すると、実装されたメソッドを識別するのに役立ちます。