2012-07-16 15 views
7

Esistono alcune relazioni di ereditarietà nelle interfacce di raccolta Java. Ad esempio, l'interfaccia Collection<T> si estenderà Iterable<T>. Ho controllato il codice sorgente in JDK, alcuni metodi definiti nella classe base vengono ripetuti in sottocategorie diverse volte. Ad esempio: Interable<T> l'interfaccia ha definito un metodo Iterator<E> iterator(); ma nell'interfaccia Collection<E> e List<T>, contiene anche lo stesso metodo. Secondo me, dal momento che l'ereditarietà viene utilizzata per ridurre la duplicazione, perché dovremmo definire lo stesso metodo in sottoclassi?Ereditarietà nelle interfacce di raccolta java

risposta

0

L'interfaccia Iterable è stata introdotta in seguito since 1.5. Quindi, prima di questa versione solo le sottoclassi java.util.Collection utilizzate per implementare iterator().

Successivamente iterator() è stato reso standard introducendo l'interfaccia Iterable in modo che qualsiasi classe che può essere iterata possa implementare questa interfaccia.

Dopo aver introdotto Iterable interfaccia, è stata fatta anche l'interfaccia Collection estendere Iterable interfaccia tale che Collection interfaccia implementa anche quella standard.

Per Ex,

  • java.sql.SQLException implementa anche Iterable
+1

Dato che si riferisce alle interfacce, non è necessario eseguire l'override. – Thomas

5

veda in java.util.List

"L'interfaccia lista I luoghi disposizioni supplementari, al di là di quelle specificate nell'interfaccia della raccolta, nel contratti dei metodi iteratore, add, remove, equals e hashCode. Sono incluse anche le dichiarazioni per altri metodi ereditati e per comodità. "

+1

+1 In effetti, immagino che le ragioni per la redizione di tali metodi siano (come la citazione che hai postato): 1. essere in grado di aggiungere diversi commenti JavaDoc (ad esempio i contratti menzionati) e 2. come comodità di fornire una rapida panoramica dei metodi disponibili. – Thomas

1

Collection è uscito in versione 1.2, ma Iterable è uscito poi in versione 1.5 per consentire concisa per-loop, quindi penso che era un caso di mantenere l'interfaccia Collection e Javadocs lo stesso fra le release. Ma sei corretto, non c'è motivo per cui non sia stato possibile rimuovere il metodo iterator() da Collection, tutto sarebbe ancora compilato.

1

L'interfaccia CollectionestendeIterable. Una superclasse astratta implementa i metodi comuni a più classi, nel caso di elenchi, è AbstractList, con ciascuna classe concreta (ad esempio, ArrayList o LinkedList) che fornisce i dettagli di implementazione specifici.

Infatti, come hai intuito, l'ereditarietà viene utilizzata per ridurre la duplicazione del codice. Ma proprio per questo, tutte le sottoclassi conterranno le stesse operazioni definite nelle superclassi, i dettagli di implementazione comuni a più classi appariranno solo una volta nella gerarchia di classi a livello di classe astratta, e non saranno "definiti" di nuovo nel sottoclassi: solo le parti che cambiano vengono ridefinite in sottoclassi concrete.