2016-04-28 6 views
5

私は、私が分類できるようにしたクラスを持っています。これを行うには、コレクションインターフェイスを実装して、Collectionsクラスで使用できるようにしてください。ListIteratorとCollectionの両方をjavaで実装することはできますか?

今は、クラス自体が単なるホップ、スキップ、ListIteratorからの飛び降りであることに気付きました。また、このインターフェイスを実装することもできます(これについては将来を見ていきます)。そこ一つの問題は、しかし、であり、それは、Collectionインタフェースと反復子インタフェース間の方法の競合があるということです。

// from the Collection interface: 
public boolean add(E someElement); 

// from the ListIterator interface: 
public void add(E someElement); 

それは一つのクラスは、両方のインターフェイスに準拠することは可能ですか?そうでない場合は、これらの2つのインタフェースが相互に排他的であることを意味しますか?

+2

私はまず、なぜあなたは両方が必要なように感じるのかと自問します。コレクションが必要な処理を行う場合、なぜListIteratorの追加要件を追加するのですか?機能的な理由がなければ、私は常にコードを複雑にすることはありません。 – Kurtymckurt

+0

これは私がこの仕事でかなり使用するリストグループになります。将来、ListIteratorを必要とする可能性があることがわかります。私が作成したソリューションは、データのListIteratorを返すメソッドを作ることでした。最も優雅な解決策ではなく、解決策はありません。 –

+0

「AbstractList」クラスを拡張するのは良い考えではありませんか?あなたは 'ArrayList'、' LinkedList'の実装とそれらが同じ問題を解決する方法を見てみることができます。 – soufrk

答えて

5

はい、残念ながら、これらは相互に排他的です。

両方を実装しようとする抽象クラスを作成すると、コンパイラエラーが発生します。

Main.java:16: error: types ListIterator and Collection are incompatible; both define add(java.lang.Object), but with unrelated return types
abstract class Foo implements Collection, ListIterator

4

あなたはそうです、両方を実装することはできません。しかし正直に言って、なぜあなたはそれをしたいのですか?

ListIteratorを公開する必要がある場合は、それを返すメソッドを追加してください。例えばCollectionを拡張

ListListIteratorを拡張しない、それはイテレータを返すlistIteratorと呼ばれるメソッドを有します。

ListIterator<E> listIterator(); 

CollectionCollectionIterableで、Iteratorないが、心の中で何かをしてください。

+1

これは私がやったことです。 :) –

0

他にも述べたように、クラスで両方を持つことはできません。

しかしListIteratorのセマンティクス、Iteratorされ、それにもかかわらず、これを禁じ:Iteratorはあなたがそれの上に繰り返した後、ワンショットのものである一方、Collectionは、あなたができるだけ頻繁にあなたが望むよう反復処理できるものです(または、ListIteratorの場合、巻き戻して再利用することもできますが、これは標準的な使用例ではありません)。

関連する問題