2012-07-16 14 views
7

Existen algunas relaciones de herencia en las interfaces de colección de Java. Por ejemplo, la interfaz Collection<T> se extenderá a Iterable<T>. Comprobé el código fuente en JDK, algunos métodos definidos en la clase base se repiten varias veces en las clases secundarias. Por ejemplo: Interable<T> interfaz definió un método Iterator<E> iterator(); Pero en la interfaz Collection<E> y List<T>, también contienen el mismo método. Según entiendo, dado que la herencia se usa para reducir la duplicación, ¿por qué deberíamos definir el mismo método en las subclases?Herencia en las interfaces de colección Java

Respuesta

0

La interfaz Iterable se introdujo más tarde since 1.5. Por lo tanto, antes de esta versión solo las subclases java.util.Collection se usaban para implementar iterator().

Más tarde iterator() se hizo estándar al introducir la interfaz Iterable de manera que cualquier clase que pueda iterar pueda implementar esta interfaz.

Después de introducir Iterable interfaz, también se hizo la interfaz Collection extender Iterable interfaz de tal manera que Collection interfaz también implementa el estándar.

Para Ex,

  • java.sql.SQLException también implementa Iterable
+1

Como se refiere a las interfaces, no hay que anularlas. – Thomas

5

Véase en java.util.List

"La interfaz Lista coloca estipulaciones adicionales, más allá de los especificados en la interfaz de la recogida en el contratos de los métodos iterator, add, remove, equals y hashCode. Las declaraciones para otros métodos heredados también se incluyen e por conveniencia ".

+1

+1 De hecho, supongo que las razones para volver a definir esos métodos son (como la cita que publicó estados): 1. poder agregar diferentes comentarios JavaDoc (es decir, los contratos que se mencionan) y 2. como una conveniencia para proporcionar una descripción general rápida de los métodos disponibles. – Thomas

1

Collection salió en versión 1.2, pero Iterable salió después en la versión 1.5 para permitir concisa para-bucles, por lo que creo que era un caso de mantener la interfaz Collection y los Javadocs la misma entre versiones. Pero está en lo correcto, no hay ninguna razón por la que no pueda eliminar el método iterator() de Collection, todo se compilaría.

1

La interfaz CollectionextiendeIterable. Una superclase abstracta implementa los métodos comunes a varias clases; en el caso de las listas, es AbstractList, con cada clase concreta (por ejemplo, ArrayList o LinkedList) que proporciona los detalles de implementación específicos.

De hecho, como habrás adivinado, la herencia se usa para reducir la duplicación de código. Pero precisamente por eso, todas las subclases contendrán las mismas operaciones definidas en las superclases, los detalles de implementación comunes a varias clases aparecerán solo una vez en la jerarquía de clases en el nivel de clase abstracta, y no se "definen" nuevamente en el subclases: solo las partes que cambian se redefinen en subclases concretas.

Cuestiones relacionadas