private boolean isValidKey(Object key) {
if (key == null)
return false;
// Cheaper than instanceof Enum followed by getDeclaringClass
Class<?> keyClass = key.getClass();
return keyClass == keyType || keyClass.getSuperclass() == keyType;
}
Run Code Online (Sandbox Code Playgroud)
如上面方法的最后一行所示,为什么EnumMap实现会检查密钥的超类?如果没有任何东西可以从枚举中获得,为什么需要进行此项检查?
您可以使用实体声明enum常量以自定义其行为
enum Bar {
NORMAL, CUSTOM {
@Override
public String toString() {
return "different";
}
};
}
Run Code Online (Sandbox Code Playgroud)
这些常量实现为该enum类型的子类.
枚举常量的可选类体隐式定义了一个匿名类声明(第15.9.5节),该声明扩展了直接封闭的枚举类型.
为了使EnumMap映射能够处理所有enum常量,因此需要通过检查键的超类是enum用于初始化EnumMap(the keyType)的类型来检查这种可能性.