Ответ 1
Ответ Тома правильный, но для решения вашей другой точки: причина, по которой эта информация не может быть выведена из параметра типа K
, должна to тип стирания.
Конструктор класса EnumMap нуждается в классе в качестве аргумента. В большинстве случаев К. Класс считался аргументом. Я все еще не понимаю, в чем причина принятия этого аргумента, а не выведения из K.
Спасибо
- pkc
Ответ Тома правильный, но для решения вашей другой точки: причина, по которой эта информация не может быть выведена из параметра типа K
, должна to тип стирания.
Реализации EnumMap
нуждаются в метаинформации о enum
, в частности о количестве значений. Объект Class
предоставляет эту информацию (ИМО было бы лучше перейти к определенному типу дескриптора перечисления). Если у вас нет доступных Class
, вы всегда можете использовать HashMap
при некотором штрафе. Я думаю, вы могли бы создать растущий/незафиксированный EnumMap
-like Map
.
Таким образом, Map
знает все возможные ключи. Он называл (внутренне) keyUniverse
. В комментариях говорится:
Все значения, содержащие K. (Cached для производительности)
Как отмечают другие, генераторы - это функция компилятора. В jvm нет реальной поддержки самих дженериков. Это означает, что общая информация не может использоваться во время выполнения.
Для EnumMap<K extends Enum>
это означает, что вы получаете EnumMap<Enum>
во время выполнения без какой-либо информации о K. Это ограничение java-дженериков можно обойти, передав классы аргументов Generic конструктору в качестве объектов класса все еще существуют во время выполнения.
Generics - это функция времени компиляции, однако этот класс K необходим во время выполнения, что-то дженериков в этом случае не будет.