为什么 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).