Подтвердить что ты не робот

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

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

Спасибо
- pkc

4b9b3361

Ответ 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 необходим во время выполнения, что-то дженериков в этом случае не будет.