Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么EnumMap实现要检查密钥';什么是超类? 私有布尔值isValidKey(对象密钥){ if(key==null) 返回false; //比紧跟着getDeclaringClass的Enum实例便宜 Class keyClass=key.getClass(); 返回keyClass==keyType | | keyClass.getSuperclass()==keyType; }_Java_Enum Map - Fatal编程技术网

Java 为什么EnumMap实现要检查密钥';什么是超类? 私有布尔值isValidKey(对象密钥){ if(key==null) 返回false; //比紧跟着getDeclaringClass的Enum实例便宜 Class keyClass=key.getClass(); 返回keyClass==keyType | | keyClass.getSuperclass()==keyType; }

Java 为什么EnumMap实现要检查密钥';什么是超类? 私有布尔值isValidKey(对象密钥){ if(key==null) 返回false; //比紧跟着getDeclaringClass的Enum实例便宜 Class keyClass=key.getClass(); 返回keyClass==keyType | | keyClass.getSuperclass()==keyType; },java,enum-map,Java,Enum Map,如上面方法的最后一行所示,为什么EnumMap实现要检查键的超类?如果无法从枚举派生任何内容,为什么需要此检查?您可以声明以自定义其行为 private boolean isValidKey(Object key) { if (key == null) return false; // Cheaper than instanceof Enum followed by getDeclaringClass Class<?> keyClass =

如上面方法的最后一行所示,为什么EnumMap实现要检查键的超类?如果无法从枚举派生任何内容,为什么需要此检查?

您可以声明以自定义其行为

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;
}
这些常量实现为

枚举常量的可选类主体隐式定义 匿名类声明(§15.9.5),立即扩展 封闭枚举类型

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

keyType)。

FYI仅供参考:具有类似实体的enum类似于匿名类。如果查看编译后的.class文件,您将看到,例如,此处显示的类将创建
Bar.class
Bar$1.class
enum Bar {
    NORMAL, CUSTOM {
        @Override
        public String toString() {
            return "different";
        }
    };
}