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
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
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 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
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.
L'interfaccia Collection
estendeIterable
. 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.
- 1. Uso generici Java nelle interfacce
- 2. Ereditarietà da interfacce generiche
- 3. Ereditarietà nelle annotazioni di ibernazione?
- 4. C# Generics, interfacce ed ereditarietà
- 5. Ereditarietà Java vs inizializzazione
- 6. Utilizzo di generici nelle interfacce
- 7. ereditarietà di interfacce con elenchi generici
- 8. Elenco interfacce nelle interfacce in Go
- 9. Riferimento automatico nelle interfacce
- 10. Argomenti ripetuti nelle interfacce
- 11. Ereditarietà multipla in java
- 12. Interfacce fluide ed ereditarietà in C++
- 13. Attributi/variabili membro nelle interfacce?
- 14. Raccolta backbone nelle raccolte
- 15. ereditarietà Java
- 16. Utilizzo di shared_ptr nelle interfacce C?
- 17. Uso di shared_ptr nelle interfacce dll
- 18. Java - Interfacce di implementazione
- 19. ereditarietà multipla su Java interfaccia
- 20. ORM Java: ereditarietà multipla (interfaccia)
- 21. array_map sulla raccolta con interfacce array?
- 22. Motivo dell'aggiunta di metodi predefiniti e statici nelle interfacce
- 23. Java ha inventato le interfacce?
- 24. Genera interfacce dattiloscritto dalle interfacce Java
- 25. Avviso di ereditarietà generica Java
- 26. È possibile utilizzare l'ereditarietà nelle interfacce AIDL?
- 27. Implementazione delle proprietà dell'interfaccia nelle interfacce?
- 28. Tagging di interfacce in Java
- 29. PHP: Posso utilizzare i campi nelle interfacce?
- 30. Ereditarietà in Core Java
Dato che si riferisce alle interfacce, non è necessario eseguire l'override. – Thomas