Ответ 1
Я думаю, потому что keySet
не является EnumSet
.;)
Причина этого не в том, что keySet
- это представление на базовой карте.
myMap.keySet().removeAll(keysToRemove); // removes multiple keys.
Я пишу программу с большим количеством перечислений, и мне нужно вернуть набор ключей 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());
Я действительно должен был проверить перед публикацией.
Я думаю, потому что keySet
не является EnumSet
.;)
Причина этого не в том, что keySet
- это представление на базовой карте.
myMap.keySet().removeAll(keysToRemove); // removes multiple keys.
EnumSet
- это реализация Set
, которая используется для использования перечисления для представления пространства ключей. Класс EnumSet
не предоставляет дополнительных нестатических методов, поэтому не было бы причин возвращать EnumSet
только для простого Set
.
Изменить: я ошибся, пожалуйста, проигнорируйте.
EnumMap расширяет AbstractMap, который объявляет keySet. AbstractMap не может объявить, что keySet возвращает EnumSet, поскольку это неверно для других подклассов AbstractMap. Следовательно, его возвращаемым типом является Set.
Если вы перейдете к источнику этого класса, тогда вы лучше поймете, почему он возвращает Set
. Вы можете найти, что ниже url
http://www.docjar.com/html/api/java/util/EnumMap.java.html
Надеюсь, это поможет вам.
Наслаждайтесь!