EnumMap类构造函数需要class作为参数。大多数时候K.class作为参数传递。我仍然没有得到接受这个作为论据的原因,而不是从K推断。
感谢
- pkc
答案 0 :(得分:9)
Tom's答案是正确的,但要解决您的另一点:不能仅从类型参数K
中推断出此信息的原因归因于type erasure。< / p>
答案 1 :(得分:5)
EnumMap
的实现需要关于enum
的元信息,特别是值的数量。 Class
对象提供了这些信息(IMO本来更适合特定的枚举描述符类型)。如果您没有Class
可用,则可以使用HashMap
,但会受到一定的惩罚。我想你可以创建一个可增长的/未提交的EnumMap
- 就像Map
。
答案 2 :(得分:2)
Map
因此知道所有可能的键。它被称为(内部)keyUniverse
。评论说:
所有值包含K.(为性能缓存)
答案 3 :(得分:2)
正如其他人指出泛型是编译器功能。 jvm对泛型本身没有真正的支持。这意味着通用信息不能在运行时使用。
对于EnumMap<K extends Enum>
,这意味着你在运行时得到EnumMap<Enum>
而没有关于K的任何信息。通过将Generic参数的类传递给构造函数,可以解决java泛型的这种限制。因为类对象在运行时仍然存在。
答案 4 :(得分:1)
Generics是一个编译时功能,但是在运行时需要这个K类,在这种情况下泛型不会做。