Почему Map не расширяет интерфейс Collection
Почему интерфейс java.util.Map
не расширяет интерфейс java.util.Collection
? Не является ли java.util.Map
набором пар ключ-значение?
Ответы
Ответ 1
Коллекция принимает элементы одного значения. Карта принимает записи пар ключ/значение. Они могли бы быть спроектированы для повторного использования одного и того же общего интерфейса, однако некоторые методы, которые они реализуют, несовместимы, например.
Collection.remove(Object) - removes an element.
Map.remove(Object) - removes by key, not by entry.
Вы можете смоделировать карту как коллекцию записей, что и делает Map.entrySet()
.
Есть несколько общих методов; size()
, isEmpty()
, clear()
, putAll/addAll()
, но вряд ли они будут иметь большое значение как автономный интерфейс. (Вместо этого можно использовать Map.entrySet()
)
Ответ 2
Поскольку интерфейс Collection
в значительной степени несовместим с интерфейсом Map
. Если Map
extended Collection
, что бы сделал метод add(Object)
?
Два интерфейса имеют очень разную семантику. Если вам нужны значения или ключи из Map
как коллекции, вы всегда можете использовать keySet()
/values()
.
Ответ 3
Почему интерфейс java.util.Map расширить интерфейс java.util.Collection?
Map
- пара ключ/значение, тогда как Collection
представляет собой набор группы объектов, хранящихся в структурированном виде, и имеет определенный механизм доступа. Причина, по которой карта не расширяет интерфейс Collections, заключается в том, что add(E e);
не поддерживает пару ключевых значений, например Map put(K, V)
.
Кроме того, что бы метод Collection iterator()
указывал, должен ли Map
его расширять? Итератор ключа или итератор значений?
Ответ 4
Поскольку некоторые методы, объявленные в Collections
, не соответствуют интерфейсу Map
и наоборот.
Примером первого является метод add(Object)
интерфейса Collections
, примером второго является put(K, V)
интерфейса Map
.
Существует просто нет последовательного способа разумно реализовать add(Object)
для Карты - это ключ, это ценность? То же самое верно для put(K, V)
. Что может быть ключом в ArrayList
?
Ответ 5
Все коллекции должны реализовывать конструктор по умолчанию и другой конструктор, который берет коллекцию в качестве параметра. Вы не можете построить карту с любой другой коллекцией, отличной от карты.
Так как Map налагает ограничения на тип объектов, которые он может удерживать, вы не можете реализовать карту как коллекцию.