Почему конструктору EnumMap нужен аргумент класса?

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

Спасибо
- pkc

12
задан prasadvk 11 August 2010 в 14:30
поделиться

5 ответов

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

5
ответ дан 2 December 2019 в 18:51
поделиться

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

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

2
ответ дан 2 December 2019 в 18:51
поделиться

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

1
ответ дан 2 December 2019 в 18:51
поделиться

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

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

2
ответ дан 2 December 2019 в 18:51
поделиться

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

9
ответ дан 2 December 2019 в 18:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: