2016-04-28 8 views
5

Quindi ho una classe che ho creato che volevo essere in grado di ordinare. Per farlo ho semplicemente implementato l'interfaccia di raccolta in modo che possa essere utilizzata nella classe Collections.È possibile implementare sia un ListIterator che una Collection in java?

Ora ho notato che la classe stessa è solo un salto, un salto e un salto da un ListIterator e sarebbe bello aver implementato anche quell'interfaccia (guardando al futuro su questo). C'è un problema, però, e cioè che c'è un conflitto tra il metodo di interfaccia di interfaccia di Raccolta e ListIterator:

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

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

E 'possibile avere una classe conforme a entrambe le interfacce? In caso contrario, significa che queste due interfacce si escludono a vicenda?

+2

Per prima cosa mi chiedo perché pensi di aver bisogno di entrambi. Se la raccolta fa ciò di cui hai bisogno, perché aggiungere il requisito aggiuntivo di ListIterator? Cerco sempre di non complicare il codice a meno che non abbia una ragione funzionale per. – Kurtymckurt

+0

Questo sarà un gruppo di liste che userò un bel po 'in questo lavoro, e posso vedere in futuro la possibilità di averne bisogno da ListIterator. La soluzione che ho creato era quella di creare un metodo che restituisse un ListIterator dei dati. Non la soluzione più aggraziata, ma una soluzione niente-meno ... –

+0

Non sarebbe una buona idea estendere la classe 'AbstractList' piuttosto. Puoi dare un'occhiata alle implementazioni di 'ArrayList',' LinkedList' e come risolvono lo stesso problema. – soufrk

risposta

5

Sì, sfortunatamente, si escludono a vicenda.

Quando si crea una classe (astratta) che tenta di implementare entrambi, si otterrà un errore del compilatore.

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

Avete ragione, non è possibile implementare entrambi. Ma ad essere onesti, perché vuoi farlo?

Se è necessario esporre un ListIterator, perché non si aggiunge un metodo che ne restituisce uno?

List che si estende Collection ad esempio non si estende ListIterator, ha un metodo chiamato listIterator che restituisce l'iteratore.

ListIterator<E> listIterator(); 

Tenete in mente qualcosa, un Collection non è un Iterator, un Collection è un Iterable.

+1

E questo è quello che ho finito per fare. :) –

0

Come altri hanno detto, non è possibile avere entrambi in una classe.

Ma la semantica di un ListIterator, essendo un Iterator, vieta questo comunque: un Collection è qualcosa che si può iterare su tutte le volte che si vuole, mentre un Iterator è una cosa one-shot, che, una volta che avete iterata su di esso , può essere gettato via (o, nel caso di un ListIterator, riavvolto e riutilizzato, ma non è il caso d'uso standard).

Problemi correlati