Java枚举映射参数混淆

Java枚举映射参数混淆,java,enum-map,Java,Enum Map,我第一次使用EnumMap,不知道参数传递实际上在做什么。据我所知,这只是“K.class”,其中K是地图键。这很好用,但我在Java的其他地方没有看到过,我也不清楚它在构建中究竟扮演了什么角色 我想这是一个理论问题,因为代码运行:“K.class”参数意味着什么,EnumMap需要它做什么?请参阅链接问题以了解更多信息 EnumMap特别需要它,因为它需要知道枚举有多少不同的值。这是因为EnumMap是一个针对Enum的高度优化的映射实现,它只使用一个数组,每个可能的值使用一个插槽(而不是像H

我第一次使用EnumMap,不知道参数传递实际上在做什么。据我所知,这只是“K.class”,其中K是地图键。这很好用,但我在Java的其他地方没有看到过,我也不清楚它在构建中究竟扮演了什么角色


我想这是一个理论问题,因为代码运行:“K.class”参数意味着什么,EnumMap需要它做什么?

请参阅链接问题以了解更多信息

EnumMap
特别需要它,因为它需要知道枚举有多少不同的值。这是因为EnumMap是一个针对Enum的高度优化的映射实现,它只使用一个数组,每个可能的值使用一个插槽(而不是像HashMap这样的更大数组)。调用
get()
时,它检索给定键的索引(即第一个枚举值、第二个枚举值等),并查找其内部数组的适当位置。为此,构造函数需要知道可能值的数量,以分配正确大小的数组。 给定类对象,它可以调用以找出此枚举的现有值的数目

此外,请想象以下代码:

enum Enum1 { V1, V2; }
enum Enum2 { W1, W2; }
EnumMap<Enum1, Object> map = new EnumMap<Enum1, Object>(Enum1.class);
map.put(Enum1.V1, new Object());
map.get(Enum2.W1);
enum Enum1{V1,V2;}
枚举枚举2{W1,W2;}
EnumMap map=新的EnumMap(Enum1.class);
put(Enum1.V1,newobject());
map.get(Enum2.W1);
现在
get
方法显然应该返回
null
。但是,正如我所说,映射在内部只有一个数组,在本例中大小为2,新对象位于第一个插槽中,空对象位于第二个插槽中。当您将Enum1.V1的引用传递给
put()
时,它没有存储该引用。但是,方法
get
现在需要知道传递的值不属于正确的枚举,因此映射中没有该键的值。这里它也需要正确枚举的类型,为此您需要将类型传递给构造函数


如果不向构造函数提供有关枚举的一些信息,它将不知道要在该映射实例中使用哪个枚举。即使您编写了新的
EnumMap()
,由于类型擦除,构造函数也无法知道泛型类型参数的值
MyEnum
。因此,需要有另一种方法将信息传递给构造函数。

基于
EnumMap
的源:似乎在构造
EnumMap
时,它首先要做的一件事是为
enum
类中的每个枚举常量分配一个元素的数组
EnumMap
被认为是高效的,因此它将分配一个固定数组是有意义的。要做到这一点,它需要了解班级。如果不是类型擦除,可以通过查看
K.class
来完成,其中
K
EnumMap
中的第一个类型参数。不幸的是,Java泛型的设计阻止了这一点。

编译器应用类型擦除后,
将从
映射中消失。但是,在运行时,
Map
实现需要确切地知道您所说的枚举类。因此,您必须指定类。谢谢您的帮助,我现在就开始。我熟悉泛型,这意味着其他地方的许多评论和讨论都并没有帮助。我只是偶然地熟悉类文本,所以我不理解是否需要类文本,因为我没有考虑到类型擦除会阻止只检查键类型。在查看实现之前,应该首先检查规范。它说“枚举映射在内部表示为数组。”