2016-04-28 19 views
5

Więc mam klasę, którą zrobiłem, którą chciałem móc sortować. Aby to zrobić, po prostu zaimplementowałem interfejs kolekcji, aby mógł być użyty w klasie Kolekcje.Czy jest możliwe zaimplementowanie zarówno ListIterator, jak i kolekcji w java?

Teraz zauważyłem, że sama klasa jest po prostu przeskokiem, pomijaniem i odsunięciem od ListIteratora i byłoby miło, gdyby zaimplementował ten interfejs również (patrząc w przyszłość na tę). Jest tylko jeden problem, chociaż, i to, że istnieje konflikt pomiędzy interfejsem metoda interfejsu Collection i ListIterator:

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

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

Czy to możliwe, że jedna klasa zgodne z obu interfejsach? Jeśli nie, czy oznacza to, że te dwa interfejsy wzajemnie się wykluczają?

+2

Najpierw zadam sobie pytanie, dlaczego czujesz, że potrzebujesz obu. Jeśli kolekcja robi to, czego potrzebujesz, po co dodawać dodatkowe wymagania ListIterator? Zawsze staram się nie komplikować kodu, chyba że mam powód funkcjonalny. – Kurtymckurt

+0

To będzie grupa list, której użyję całkiem sporo w tym zadaniu, i widzę w przyszłości możliwość potrzebnego ListIteratora z tego. Rozwiązaniem, które stworzyłem, było wykonanie metody, która zwróciła ListIterator danych. Nie jest to najbardziej zgrabne rozwiązanie, ale rozwiązanie nie ma sobie równych ... –

+0

Czy nie byłoby dobrym pomysłem rozszerzenie klasy 'AbstractList'? Możesz rzucić okiem na implementacje 'ArrayList',' LinkedList' i jak rozwiązują ten sam problem. – soufrk

Odpowiedz

5

Tak, niestety, wzajemnie się wykluczają.

Po utworzeniu klasy (abstrakcyjnej), która próbuje zaimplementować obie, zostanie zgłoszony błąd kompilatora.

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

Masz rację, nie możesz zaimplementować obu. Ale szczerze mówiąc, dlaczego chcesz to zrobić?

Jeśli musisz ujawnić ListIterator, dlaczego nie dodasz metody, która zwraca jeden?

List która rozciąga Collection na przykład nie rozciąga ListIterator, ma metodę zwaną listIterator zwracającej iteracyjnej.

ListIterator<E> listIterator(); 

Trzymać coś w umysłu, Collection nie jest Iterator, A Collection jest Iterable.

+1

I to właśnie zrobiłem. :) –

0

Jak powiedzieli inni, nie można mieć obu na zajęciach.

Ale semantyka a ListIterator, będąc Iterator, zabrania tym niemniej: a Collection coś można iteracyjne nad tak często, jak chcesz, podczas gdy Iterator jest jeden strzał rzeczą, która, gdy już potwierdzili nad nim , może zostać wyrzucony (lub, w przypadku modelu ListIterator, może być przewinięty i ponownie użyty, ale nie jest to standardowy przypadek użycia).

Powiązane problemy