Для конструктора класса EnumMap нужен класс как аргумент. Большинство времен K.class передало как аргумент. Я все еще не получаю то, что является причиной принятия этого как аргумент вместо того, чтобы вывести из K.
Спасибо
- pkc
Реализации EnumMap
нуждаются в метаинформации о перечислении
, в частности о количестве значений. Эту информацию предоставляет объект Class
(IMO, было бы лучше выбрать конкретный тип дескриптора перечисления). Если у вас нет доступного класса
, вы всегда можете использовать HashMap
за определенную плату. Думаю, вы могли бы создать растущую / незафиксированную EnumMap
-подобную карту
.
Таким образом, карта
знает все возможные ключи. Он называется (внутренне) keyUniverse
. В комментариях говорится:
Все значения, составляющие K. ( Кэшировано для производительности )
Generics - это функция времени компиляции, однако этот класс K необходим во время выполнения, чего-то, что generics не будет делать в этом случае.
Как отмечают другие, дженерики - это функция компилятора. JVM не имеет реальной поддержки для дженериков. Это означает, что общая информация не может использоваться во время выполнения.
Для EnumMap
это означает, что вы получаете EnumMap
во время выполнения без какой-либо информации о K. Это ограничение универсальных Java-шаблонов может работать путем передачи классов общих аргументов конструктору, поскольку объекты класса все еще существуют во время выполнения.
Ответ Тома правильный, но обратимся к другому вашему вопросу: причина, по которой эту информацию нельзя просто вывести из параметра типа, K
, заключается в стирании типа .