2012-07-16 12 views
7

Javaコレクションインタフェースにはいくつかの継承関係があります。たとえば、Collection<T>インターフェイスはIterable<T>に拡張されます。 JDKでソースコードをチェックしましたが、基本クラスで定義されているいくつかのメソッドがサブクラスで何度か繰り返されています。例: Interable<T>インターフェイスで定義されたメソッドIterator<E> iterator();しかし、インターフェイスCollection<E>List<T>では、同じメソッドが含まれています。私の理解では、継承は重複を減らすために使用されるので、なぜサブクラスで同じメソッドを定義する必要がありますか?Javaコレクションインタフェースの継承

答えて

0

Iterableインターフェイスは、後でsince 1.5に導入されました。ですから、以前のバージョンではjava.util.Collectionのサブクラスでiterator()を実装していました。

後でiterator()は、反復できる任意のクラスがこのインターフェイスを実装できるようにIterableインターフェイスを導入することによって標準化されました。

Iterableインターフェイスを導入したあと、CollectionインターフェイスもIterableインターフェイスを拡張して、Collectionインターフェイスも標準のインターフェイスを実装するようにしました。例、

  • java.sql.SQLExceptionについては

    も「Listインタフェースは、上で、Collectionインタフェースで指定されたものを超えて、追加の規定を置くjava.util.List

    に反復処理可能

+1

彼はインターフェースを参照しているので、オーバーライドは必要ありません。 – Thomas

5

参照を実装iterator、add、remove、equals、およびhashCodeメソッドのコントラクト。他の継承メソッドの宣言も含まれています。 e便宜のために。

+1

+1事実私はそれらのメソッドを再宣言する理由は(あなたが州を投稿した引用として)推測されます:1.異なるJavaDocコメント(言及されている契約)を追加することができ、利用可能な方法の概要。 – Thomas

1

Collectionは、リリース1.2で出てきたが、Iterableは、forループ簡潔可能にするためにリリース1.5で、その後出てきたので、私はそれがリリース間で同じCollectionインタフェースおよびJavadocを保つためのケースだったと思います。しかし正しいですが、メソッドをCollectionから削除できない理由はありません。すべてがコンパイルされます。

1

Collectionインターフェースは、Iterableです。抽象スーパークラスはいくつかのクラスに共通のメソッドを実装しています(リストの場合はAbstractList)、各具体クラス(具体的にはArrayListまたはLinkedList)が具体的な実装の詳細を提供します。

実際、あなたが推測したように、継承はコードの重複を減らすために使用されます。しかし、そのために、すべてのサブクラスにはスーパークラスで定義された同じ操作が含まれます。複数のクラスに共通の実装の詳細は、抽象クラスレベルのクラス階層に1回しか表示されません。サブクラス - 変更される部分だけが具象サブクラスで再定義されます。