Подтвердить что ты не робот

Почему EnumMap <T>.keySet() возвращает Set <T>(), а не EnumSet <T>()?

Я пишу программу с большим количеством перечислений, и мне нужно вернуть набор ключей EnumMap. Но EnumMap.keySet() возвращает Set(), поэтому, чтобы получить EnumSet, я хочу использовать cast:

EnumMap<SomeEnum, Object> myMap = getMap();
EnumSet<SomeEnum> myEnum = (EnumSet<SomeEnum>) myMap.keySet();

Если я не произведу, компилятор будет жаловаться на несоответствие типа; он не может преобразовать из Set<SomeEnum> в EnumSet<SomeEnum>. Кажется излишним придать это, поскольку ключи EnumMap всегда будут перечислением. Кто-нибудь знает, почему метод keySet() был построен таким образом? Я иногда думал, что это может быть связано с тем, что EnumSet является абстрактным классом, но, безусловно, EnumMap может просто вернуть все, что предлагает factory метод EnumSet.

Привет, все!

РЕДАКТИРОВАТЬ: Мне очень жаль, приведенный выше код вызывает CastClassException. Вы можете получить EnumSet, используя

EnumSet<SomeEnum> myEnum = EnumSet.copyOf(myMap.keySet());

Я действительно должен был проверить перед публикацией.

4b9b3361

Ответ 1

Я думаю, потому что keySet не является EnumSet.;)

Причина этого не в том, что keySet - это представление на базовой карте.

myMap.keySet().removeAll(keysToRemove); // removes multiple keys.

Ответ 2

EnumSet - это реализация Set, которая используется для использования перечисления для представления пространства ключей. Класс EnumSet не предоставляет дополнительных нестатических методов, поэтому не было бы причин возвращать EnumSet только для простого Set.

Ответ 3

Изменить: я ошибся, пожалуйста, проигнорируйте.

EnumMap расширяет AbstractMap, который объявляет keySet. AbstractMap не может объявить, что keySet возвращает EnumSet, поскольку это неверно для других подклассов AbstractMap. Следовательно, его возвращаемым типом является Set.

Ответ 4

Если вы перейдете к источнику этого класса, тогда вы лучше поймете, почему он возвращает Set. Вы можете найти, что ниже url

http://www.docjar.com/html/api/java/util/EnumMap.java.html

Надеюсь, это поможет вам.

Наслаждайтесь!