2

ご存知のように、インターフェースは Java のインターフェースを拡張できます。これについて質問があります。インターフェイス B がインターフェイス A を拡張する場合、B は A で定義されたメソッドを実装する必要はありません。しかし、java.util パッケージでは、List インターフェイスは Collection インターフェイスを拡張し、Collection メソッドを実装します。これらのメソッドもメソッド宣言があるだけです。

なぜこれを行うのですか?より良い方法がありますか?サブインターフェイスでメソッドを実装するかどうかに違いはありますか?

4

4 に答える 4

5

メソッドの実装を提供/置換するだけでなく、メソッドをオーバーライドすることで、より具体的なjavadocを提供し、戻り値のタイプを絞り込むことができます。

たとえば、Collection.iterator()は次のように指定されます。

このコレクションの要素に対するイテレータを返します。要素が返される順序に関する保証はありません(このコレクションが保証を提供するクラスのインスタンスでない限り)。

whileList.iterator()はによって指定されます

このリストの要素に対して適切な順序でイテレータを返します。

于 2012-11-03T02:13:18.490 に答える
2

java.util.Listには実装はありませんが、宣言があります。代わりに、Listのjavadocsは次のように述べています。

Listインターフェースは、Collectionインターフェースで指定されたもの以外に、イテレーター、add、remove、equals、およびhashCodeメソッドのコントラクトに追加の規定を配置します。便宜上、他の継承されたメソッドの宣言もここに含まれています。

于 2012-11-03T02:18:12.170 に答える
0

インターフェイスはメソッドを実装できないため、インターフェイスリストはコレクションのメソッドを実装しません。メソッドを宣言するだけです。インターフェイスは100%抽象クラスのようなものです。すべてのメソッドは抽象メソッドである必要があります。

おそらくあなたの混乱はインターフェースを実装する抽象クラスから来ています:これらのクラスはインターフェースのメソッドを実装してはいけません(許可されているにもかかわらず)、最初の具象クラスだけが実装しなければなりません。

于 2012-11-03T02:15:48.143 に答える
0

Java では、インターフェイスは完全に抽象化されています。それらは実装を持つことはできません。

メソッドを再宣言することは、メソッドを実装することと同じではありません。また、別のインターフェイスを拡張するインターフェイスの目的は、既存のメソッド宣言を再宣言するだけではなく、より具体的なメソッド宣言を追加することであるため、メソッドを再宣言しても意味がありません (メソッド シグネチャがまったく同じ場合)。


編集


@ Arhamと@meriton の回答で指摘されているように、再宣言の目的は、サブインターフェイスに従ってメソッドを再指定することです。そのため、基になるコレクションにアクセスするクライアント コードの場合、再宣言されたメソッドには、スーパー インターフェイスのより一般的な仕様よりも具体的な別の仕様が存在します。

于 2012-11-03T02:12:28.553 に答える