为什么EnumMap实现会检查密钥的超类?

haw*_*awk 3 java enum-map

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实现会检查密钥的超类?如果没有任何东西可以从枚举中获得,为什么需要进行此项检查?

Sot*_*lis 9

您可以使用实体声明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)的类型来检查这种可能性.

  • *仅供参考:*具有此类主体的枚举类似于匿名类.你会看到,如果你看一下编译好的.class文件,例如这里显示的类将创建`Bar.class`和`Bar $ 1.class`. (2认同)