3
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 实现会检查键的超类?如果没有任何东西可以从枚举中得到,为什么需要这个检查?

4

1 回答 1

9

您可以使用主体声明enum常量以自定义其行为

enum Bar {
    NORMAL, CUSTOM {
        @Override
        public String toString() {
            return "different";
        }
    };
}

这些常量被实现为该类型的子enum类。

枚举常量的可选类主体隐式定义了一个匿名类声明(第 15.9.5 节),该声明扩展了直接封闭的枚举类型。

为了使EnumMap映射与所有enum常量一起工作,因此需要通过检查键的超类是否是enum用于初始化EnumMap(the keyType) 的类型来检查这种可能性。

于 2017-01-17T17:21:30.780 回答