Istnieje kilka relacji dziedziczenia w interfejsach kolekcji Java. Na przykład interfejs Collection<T>
rozszerzy się na Iterable<T>
. Sprawdziłem kod źródłowy w JDK, niektóre metody zdefiniowane w klasie bazowej powtarzają się w podklasach kilka razy. Na przykład: Interable<T>
interfejs zdefiniowano metodę Iterator<E> iterator();
Ale w interfejsie Collection<E>
i List<T>
, również zawierają tę samą metodę. W moim rozumieniu, skoro dziedziczenie jest używane do ograniczenia duplikacji, dlaczego mielibyśmy zdefiniować tę samą metodę w podklasach? InterfejsDziedziczenie w interfejsach kolekcji java
Odpowiedz
został wprowadzony później: since 1.5
. Więc wcześniej do tej wersji tylko podklasy java.util.Collection
używane do implementacji iterator()
.
Później iterator()
został standardem, wprowadzając interfejs Iterable
, tak że każda klasa, która może iterować, może zaimplementować ten interfejs.
Po wprowadzeniu interfejsu Iterable
interfejs Collection
został również rozszerzony o interfejs Iterable
, dzięki czemu interfejs Collection
implementuje również interfejs standardowy.
Ex,
java.sql.SQLException
realizuje również iterable
Zobacz w java.util.List
„Interfejs Lista umieszcza dodatkowe postanowienia, poza wymienionymi w interfejsie zbiórki, w kontrakty metod iteratora, dodawania, usuwania, równań i hashCode. Deklaracje dotyczące innych dziedziczonych metod są również e dla wygody. "
+1 W rzeczywistości zgaduję, że powody redeclaring tych metod są (jako cytat, który wysłałeś stany): 1. możliwość dodawania różnych komentarzy JavaDoc (tj. Umów, które są wymienione) i 2. dla wygody dostarczenia szybki przegląd dostępnych metod. – Thomas
Collection
ukazał się w wydaniu 1.2, ale Iterable
wyszedł potem w wydaniu 1.5, aby umożliwić zwięzłe for-pętle, więc myślę, że to był przypadek utrzymanie interfejs Collection
i Javadocs samo pomiędzy wersjami. Ale masz rację, nie ma powodu, aby nie można było usunąć metody iterator()
z Collection
, wszystko by się jeszcze skompilowało.
Interfejs Collection
Interfejs rozciąga się na:Iterable
. Klasa abstrakcyjna abstrakcyjna implementuje metody wspólne dla kilku klas, w przypadku list jest to AbstractList
, z każdą klasą betonu (powiedzmy, ArrayList
lub LinkedList
) dostarczającą szczegółowe szczegóły implementacji.
W rzeczywistości, jak można się domyślić, dziedziczenie służy do ograniczenia duplikacji kodu. Ale właśnie z tego powodu wszystkie podklasy będą zawierały te same operacje zdefiniowane w nadklasach, szczegóły implementacji wspólne dla kilku klas pojawią się tylko raz w hierarchii klas na abstrakcyjnym poziomie klasy, i nie są "zdefiniowane" ponownie w klasie. podklasy - tylko części, które się zmieniają, są przedefiniowane w konkretnych podklasach.
Od kiedy odnosi się do interfejsów, nie ma nadrzędnego znaczenia. – Thomas