Je viens de regarder les Set
et nous avons constaté qu'elle ne redéclarait que les fonctions déjà présentes dans l'interface Collection
interface. Set
s'étend lui-même Collection
alors cela ne veut-il pas dire que le Set
possède automatiquement toutes les fonctions de l'interface Collection
? Pourquoi sont-ils redéclarés alors ?
Par exemple, Set
redéclare ceci :
/**
* 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();
Et la déclaration dans 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();
Cela me semble très redondant. Pourquoi ne pas simplement définir le Set
comme interface :
public interface Set<E> extends Collection<E> {}
Je pense qu'il n'y a pas de différence unique entre ces interfaces, n'est-ce pas ?
Bien sûr, je ne pose pas de question sur les différentes sémantiques / significations des termes suivants Set
. Je le sais. Je demande simplement si, techniquement (c'est-à-dire pour le compilateur), cela fait une différence. C'est-à-dire, d'une manière générale :
interface A { void foo(); }
interface B extends A { void foo(); }
interface C extends A {}
Maintenant, y a-t-il une différence entre A
, B
o C
?
Alors que le contrat (c'est-à-dire ce qui est dit dans la documentation) peut vraiment être différent pour certaines fonctions (comme pour les fonctions add
), il y a une raison valable de les redéclarer : Pour pouvoir mettre une nouvelle documentation, c'est à dire définir le nouveau contrat.
Cependant, il existe également des fonctions (comme isEmpty
) qui ont exactement la même documentation / le même contrat. Pourquoi sont-ils également redéclarés ?