Java 匿名内部类的isEnum()不明确行为

Java 匿名内部类的isEnum()不明确行为,java,enums,Java,Enums,根据我的理解,Class.isEnum()应该为使用enum语句声明的任何枚举值返回true 如果匿名声明枚举,则返回false isEnum()的文档说明: “当且仅当该类在中声明为枚举时,返回true 源代码。” 这对我来说似乎有点模棱两可 我正在寻找一种将枚举常量与其他对象区分开来的方法,因此我需要isEnum()为所有枚举常量返回true,即使它们以匿名方式重写某些内容 除此之外,还有什么方法可以识别枚举常量吗 运行该类并查看每个常量的isEnum()结果。它将为每个常量打印出isEnu

根据我的理解,
Class.isEnum()
应该为使用
enum
语句声明的任何枚举值返回true

如果匿名声明枚举,则返回false

isEnum()
的文档说明:

“当且仅当该类在中声明为枚举时,返回true 源代码。”

这对我来说似乎有点模棱两可

我正在寻找一种将枚举常量与其他对象区分开来的方法,因此我需要
isEnum()
为所有枚举常量返回true,即使它们以匿名方式重写某些内容

除此之外,还有什么方法可以识别枚举常量吗

运行该类并查看每个常量的
isEnum()
结果。它将为每个常量打印出
isEnum()
的值。

我希望
isEnum()
的所有常量都应该返回true。 但遗憾的是,对于
isEnum()
,第三个常量返回false

public enum EnumTest {
Alpha(3), Beta(6), Delta(4) {
    @Override
    public int getValue() {
        return -1;
    }

    @Override
    public String toString() {
        return "Gamma";
    }
},
Epsilon(9);

private int value;

EnumTest(int value) {
    this.value = value;
}

public int getValue() {
    return this.value;
}

public static boolean isEnumWorkaround(Class enumClass) {
    while (enumClass.isAnonymousClass()) {
        enumClass = enumClass.getSuperclass();
    }
    return enumClass.isEnum();
}

public static void main(String[] args) {
    for (EnumTest thing : EnumTest.values()) {
        String nameString = thing + " (" + thing.name() + ")";
        System.out.println(String.format(
                "%-18s isEnum = %-5b [workaround isEnum = %b]", nameString, thing
                        .getClass().isEnum(), isEnumWorkaround(thing.getClass())));
    }
  }
}

请检查并让我知道我的理解是否正确。

您的理解是正确的,您需要您的
枚举解决方案来检查第三个值是否为枚举。检查ISENM的代码:


它检查枚举位和超类。这意味着,如果您有一个具体的类不是直接继承自
java.lang.Enum
,那么您的
Enum解决方案可能仍然会失败,但我想对于Enum常量来说这是不可能的…

如果我的理解是正确的,
类#isEnum()
不是为了让您检查类是否是Enum。它只允许您反思类声明

正如在评论中提到的,你想做的事情很容易通过

yourEnumValue.getClass().isAssignableFrom(Enum.class)


只做Enum的
objectinstanceof
对你有用吗?Java是强类型的,但是…你应该知道你是在处理Enum…还是
Enum.class.isAssignableFrom(object.getClass())
有用?(如果你有类而不是实例)@Erwin那是个好主意,让我也试试@Makoto-我不是在和enum的朋友捣乱,我只是在遵守规则。是的…同意它也可能失败…:(搜索最佳替代方案..如果您能分享您对我的最佳选择的想法,那就太好了-谢谢@Adrian难道您不认为必须为此更改java文档吗?我认为它已经明确指出“当且仅当该类在源代码中声明为枚举时才返回true”。对于通过反射提供的内容,有许多类似的情况。例如,iirc,如果您
getDeclaredMethods()
,它将不包括从其超类继承的内容。
isEnum()
通过类似的参数,只允许您内省类本身。
yourEnumValue instanceof Enum