为什么EnumMap构造函数需要类参数?

时间:2010-08-11 14:18:12

标签: java enums

EnumMap类构造函数需要class作为参数。大多数时候K.class作为参数传递。我仍然没有得到接受这个作为论据的原因,而不是从K推断。

感谢
- pkc

5 个答案:

答案 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类,在这种情况下泛型不会做。