Почему конструктор EnumMap нуждается в аргументе класса? - PullRequest
12 голосов
/ 11 августа 2010

Конструктор класса EnumMap нуждается в классе в качестве аргумента.Большую часть времени K.class передавался в качестве аргумента.Я до сих пор не понимаю, в чем причина принятия этого в качестве аргумента вместо вывода из К.

Спасибо
- pkc

Ответы [ 5 ]

9 голосов
/ 11 августа 2010

Ответ Тома правильный, но для решения другого вопроса: причина, по которой эта информация не может быть просто выведена из параметра типа K, вызвана стиранием типа .

5 голосов
/ 11 августа 2010

Реализации EnumMap нуждаются в метаинформации о enum, в частности о количестве значений. Объект Class предоставляет эту информацию (IMO, было бы лучше использовать определенный тип дескриптора enum). Если у вас нет Class, вы всегда можете использовать HashMap с некоторым штрафом. Я думаю, вы могли бы создать растущий / незафиксированный EnumMap -подобный Map.

2 голосов
/ 12 августа 2010

Как отмечают другие, дженерики являются функцией компилятора. JVM не имеет никакой реальной поддержки для дженериков. Это означает, что общая информация не может использоваться во время выполнения.

Для EnumMap<K extends Enum> это означает, что вы получаете EnumMap<Enum> во время выполнения без какой-либо информации о K. Это ограничение дженериков java можно обойти, передав классы универсальных аргументов конструктору в качестве объектов класса. все еще существует во время выполнения.

2 голосов
/ 11 августа 2010

Таким образом, Map знает все возможные ключи.Это называется (внутренне) keyUniverse.В комментариях говорится:

Все значения, включающие K. ( Кэшировано для производительности )

1 голос
/ 12 августа 2010

Generics - это функция времени компиляции, однако этот класс K необходим во время выполнения, чего-то общего в этом случае не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...