Javaコレクションインターフェイスにはいくつかの継承関係があります。たとえば、Collection<T>
インターフェイスは。を拡張しIterable<T>
ます。JDKのソースコードを確認しましたが、基本クラスで定義されたメソッドの中には、サブクラスで数回繰り返されるものがあります。例:
Interable<T>
interfaceはメソッドを定義し ましたIterator<E> iterator();
が、interfaceCollection<E>
とList<T>
、にも同じメソッドが含まれています。私の理解では、継承は重複を減らすために使用されるので、なぜサブクラスで同じメソッドを定義する必要があるのでしょうか。
4 に答える
「List インターフェースは、 Collection インターフェースで指定されたものを超えて、反復子、add、remove、equals、および hashCode メソッドのコントラクトに追加の規定を配置します。他の継承されたメソッドの宣言も便宜上ここに含まれています。」
Collection
はリリース 1.2 でIterable
登場しましたが、その後のリリース 1.5 で簡潔な for ループを可能にするために登場したため、Collection
リリース間でインターフェースと Javadoc を同じに保つケースだったと思います。iterator()
しかし、あなたは正しいです。メソッドを から削除できなかった理由はありませんCollection
。すべてがコンパイルされます。
Collection
インターフェイスが拡張 されIterable
ます。抽象スーパークラスは、いくつかのクラスに共通のメソッドを実装します。リストの場合は、AbstractList
具体的なクラス (ArrayList
または などLinkedList
) が特定の実装の詳細を提供します。
実際、ご想像のとおり、継承はコードの重複を減らすために使用されます。しかし、まさにそのため、すべてのサブクラスにはスーパークラスで定義された同じ操作が含まれ、いくつかのクラスに共通の実装の詳細は、抽象クラス レベルのクラス階層に 1 回だけ表示され、それらはクラス階層で再度「定義」されることはありません。サブクラス - 変更された部分のみが具体的なサブクラスで再定義されます。
The Iterable
interface was introduced later since 1.5
. So, earlier to this version only java.util.Collection
subclasses used to implement iterator()
.
Later iterator()
was made standard by introducing Iterable
interface such that any Class which can iterated can implement this interface.
After introducing Iterable
interface, the Collection
interface was also made to extend Iterable
interface such that Collection
interface also implements the standard one.
For Ex,
java.sql.SQLException
also implements Iterable