Я просто посмотрел на интерфейс Set
и обнаружил, что он в основном (или полностью) только обновляет функции, которые уже находятся в интерфейсе Collection
. Set
сам расширяет Collection
, поэтому это не означает, что интерфейс Set
автоматически выполняет все функции от Collection
? Так почему же они были обьяснены?Java: установить различия интерфейса интерфейса и интерфейса
Например, Set
redeclares это:
/**
* 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> {}
Я думаю, что нет ни одного различия между этими интерфейсами, не так ли?
Конечно, я не спрашиваю о другом семантикой/значении Set
. Я знаю это. Я просто спрашиваю, имеет ли это технически (т. Е. Компилятору) какую-либо разницу. Т.е., вообще говоря:
interface A { void foo(); }
interface B extends A { void foo(); }
interface C extends A {}
Теперь, есть ли разница между A
, B
или C
?
Хотя контракт (т.е. то, что сказано в документации) действительно может быть различным для некоторых функций (как для add
), есть веская причина, чтобы переопределить их: Для того, чтобы иметь возможность поставить новую документацию, т.е. определить новый контракт.
Однако есть также функции (например, isEmpty
), которые имеют точно такую же документацию/контракт. Почему они также переоформлены?
Я буду голодать, пока это не будет рассмотрено! – willcodejavaforfood
вам нужно понять, что интерфейс не является серебряной пулей. в интерфейсе вы не можете понять последовательность или неинвариант, который был проведен любым классом в java. эта проблема является открытой проблемой, которую разработчики Java решили решить, указав ответ в руководстве. если у вас есть лучшее решение, представление в языке syntex sequnce и инвариантов, здесь есть место, чтобы заявить об этом. – none
@none: Это не совсем то, с чем я столкнулся с моим вопросом, но это действительно еще один очень интересный вопрос. Я видел некоторые предложения, где можно было написать сложные логические предварительные и пост-условия для функций. Я точно не помню, как это называется. – Albert