Я только что просмотрел интерфейс Set
и обнаружил, что он в основном (или полностью) повторно объявляет только функции, которые уже присутствуют в интерфейсе Collection
. Set
сам расширяет Collection
, так что не означает ли это, что интерфейс Set
автоматически имеет все функции из Collection
? Так почему же они объявлены заново?
Например, Set
повторно объявляет это:
/**
* 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();
И объявление в 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();
Мне это кажется очень избыточным. Почему бы просто не определить интерфейс Set
как:
public interface Set<E> extends Collection<E> {}
Я думаю, что нет единой разницы между этими интерфейсами, верно?
Конечно, я не спрашиваю о различной семантике / значении Установите
. Я знаю это. Я просто спрашиваю, имеет ли это технически (то есть для компилятора) какая-либо разница. То есть, говоря в общем:
interface A { void foo(); }
interface B extends A { void foo(); }
interface C extends A {}
А есть ли разница между A
, B
или C
?
Пока договор (т.е. что сказано в документации) могут действительно отличаться для некоторых функций (например, для add
), есть веская причина для их повторного объявления: чтобы иметь возможность разместить новую документацию, то есть определить новый контракт.
Однако существуют также функции (например, isEmpty
), которые имеют точно такую же документацию / контракт. Почему они также повторно объявлены?