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