为什么 EnumMap 实现要检查键的超类?
Why does EnumMap implementation check for the key's superclass?
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;
}
如上述方法的最后一行所示,为什么 EnumMap 实现要检查键的超类?如果无法从枚举派生出任何东西,为什么需要进行此检查?
您可以声明 enum
constants with bodies 来自定义它们的行为
enum Bar {
NORMAL, CUSTOM {
@Override
public String toString() {
return "different";
}
};
}
这些常量实现为subclasses of the enum
type.
The optional class body of an enum constant implicitly defines an
anonymous class declaration (§15.9.5) that extends the immediately
enclosing enum type.
为了使 EnumMap
映射与所有 enum
常量一起使用,因此需要通过检查键的超类是用于初始化的 enum
类型来检查这种可能性EnumMap
(keyType
).
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;
}
如上述方法的最后一行所示,为什么 EnumMap 实现要检查键的超类?如果无法从枚举派生出任何东西,为什么需要进行此检查?
您可以声明 enum
constants with bodies 来自定义它们的行为
enum Bar {
NORMAL, CUSTOM {
@Override
public String toString() {
return "different";
}
};
}
这些常量实现为subclasses of the enum
type.
The optional class body of an enum constant implicitly defines an anonymous class declaration (§15.9.5) that extends the immediately enclosing enum type.
为了使 EnumMap
映射与所有 enum
常量一起使用,因此需要通过检查键的超类是用于初始化的 enum
类型来检查这种可能性EnumMap
(keyType
).