Set.add
уточняет договор Collection.add
.Из Javadoc последнего:
Коллекции, которые поддерживают эту операцию, могут накладывать ограничения на то, какие элементы могут быть добавлены в эту коллекцию.В частности, некоторые коллекции откажутся добавлять нулевые элементы, а другие наложат ограничения на тип элементов, которые могут быть добавлены.Классы коллекций должны четко указывать в своей документации любые ограничения на то, какие элементы могут быть добавлены.
Это то, что сделано в Javadoc Set.add
, где говорится, что, например, повторяющиеся элементы не добавляются вset.
Обновление: по контрактам и интерфейсам
(включая и расширяя мои комментарии ниже, чтобы завершить этот ответ.)
Контракт договораМетод указывает - формально или неформально - , что ожидается от вызывающей стороны в качестве входных данных для этого метода, и каков гарантированный результат вызова метода .Например, в контракте может быть указано, что никаких параметров null
не ожидается, и если методу передан параметр null
, он выдаст NullPointerException
.Javadoc методов в среде Collection является хорошим примером таких контрактов.
Обратите внимание, что некоторые языки допускают или даже требуют формального определения контрактов , таким образом, контракты компилируются в код и активно принудительное выполнение . Eiffel - это такой язык.Однако у Java нет такой возможности; контракты, определенные в Javadoc, не являются формальными , для них даже не определен строгий формат.Они предназначены только для чтения человеком и остаются незамеченными JVM.Таким образом, нарушение контракта в Java может быть не сразу заметно , только позже, когда начнут появляться возникающие ошибки.
Контракты могут быть определены как для конкретных методов класса, так и для абстрактных / интерфейсных методов.Контракт интерфейса является (должен быть) обязательным для всех его реализаций.Т.е. HashSet.add
, TreeSet.add
, LinkedHashSet.add
и т. Д. Все должны выполнить контракт Set.add
(и могут дополнительно его усовершенствовать).Реализация, которая не работает в соответствии с контрактом Set.add
, нарушает принцип подстановки Лискова .