Acabo de buscar la interfaz Set
y encontré que la mayoría (o completamente) solo redeclara funciones que ya están en la interfaz Collection
. Set
se extiende a sí mismo Collection
, por lo que no significa que la interfaz Set
tiene automáticamente todas las funciones de Collection
? Entonces, ¿por qué se vuelven a declarar?Java: establecer la interfaz y las diferencias de interfaz de colección
Por ejemplo, Set
redeclares esto:
/**
* Returns the number of elements in this set (its cardinality). If this
* set contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
* <tt>Integer.MAX_VALUE</tt>.
*
* @return the number of elements in this set (its cardinality)
*/
int size();
/**
* Returns <tt>true</tt> if this set contains no elements.
*
* @return <tt>true</tt> if this set contains no elements
*/
boolean isEmpty();
y la Declaración de Collection
:
/**
* Returns the number of elements in this collection. If this collection
* contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
* <tt>Integer.MAX_VALUE</tt>.
*
* @return the number of elements in this collection
*/
int size();
/**
* Returns <tt>true</tt> if this collection contains no elements.
*
* @return <tt>true</tt> if this collection contains no elements
*/
boolean isEmpty();
esto parece muy redundante para mí. ¿Por qué no acaba de definir la interfaz Set
como:
public interface Set<E> extends Collection<E> {}
Creo que no hay ninguna diferencia entre esas interfaces sola, ¿verdad?
Por supuesto que no estoy pidiendo acerca de la semántica diferente/significado de Set
. Yo sé eso. Solo estoy preguntando si técnicamente (es decir, el compilador) tiene alguna diferencia. Es decir, en términos generales:
interface A { void foo(); }
interface B extends A { void foo(); }
interface C extends A {}
Ahora, ¿hay alguna diferencia entre A
, B
o C
?
Si bien el contrato (es decir, lo que se dice en la documentación) en realidad puede ser diferente para algunas funciones (como por add
), hay una razón válida para redeclararlas: Para ser capaz de poner una nueva documentación, es decir, para definir el nuevo contrato. No hay funciones (como isEmpty
) que tengan exactamente la misma documentación/contrato. ¿Por qué también son redeclarados?
¡Iniciaré una huelga de hambre hasta que esto haya sido resuelto! – willcodejavaforfood
tiene que entender que la interfaz no es una bala de plata. en la interfaz no se puede entender la secuencia, ni la invariante que haya tenido cualquier clase en java. este problema es un problema abierto que los desarrolladores de Java decidieron resolver indicando la respuesta en el manual. si tiene una mejor solución, de representar en lenguaje syntex el sequnce y invariantes, aquí hay un lugar para indicarlo. – none
@none: Bueno, esto no es exactamente a lo que me dirigía con mi pregunta, pero esta es de hecho otra pregunta muy interesante. He visto algunas propuestas en las que era posible escribir condiciones previas y posteriores lógicas complejas para las funciones. Aunque ya no recuerdo exactamente cómo se llamaba. – Albert