Java: интерфейс Set и различия в интерфейсе Collection

Я только что просмотрел интерфейс 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 ), которые имеют точно такую ​​же документацию / контракт. Почему они также повторно объявлены?

22
задан Albert 20 October 2010 в 14:34
поделиться