Class::isEnum需要检查此项。getSuperclass()==java.lang.Enum.Class;

Class::isEnum需要检查此项。getSuperclass()==java.lang.Enum.Class;,java,Java,为什么需要进行以下检查 public boolean isEnum() { // An enum must both directly extend java.lang.Enum and have // the ENUM bit set; classes for specialized enum constants // don't do the former. return (this.getModifiers() & ENUM) != 0 &&

为什么需要进行以下检查

public boolean isEnum() {
    // An enum must both directly extend java.lang.Enum and have
    // the ENUM bit set; classes for specialized enum constants
    // don't do the former.
    return (this.getModifiers() & ENUM) != 0 &&
        this.getSuperclass() == java.lang.Enum.class;
}
这张支票不够吗

 this.getSuperclass() == java.lang.Enum.class
考虑以下代码:

(this.getModifiers() & ENUM) != 0
:

Foo.A
类不被视为枚举;
Foo.B
的类别为

这是因为
Foo.A
实际上是
Foo
的子类的实例,而不是enum类本身


不清楚为什么需要检查修饰符位;我想说,它可能比后续检查更便宜,从而避免了常见情况下的工作,但它只是引用相等,并不昂贵。也许是为了防止其他JVM语言不强制执行不能直接扩展
Enum
的限制。

这是什么:this.getModifiers()&Enum应该做什么?我宁愿认为这是另一种情况,因为“专用枚举常量的类不做前者”。@user207421专用枚举常量的类不做后者;他们确实做了前者。奇怪的是,
isEnum
对于
A
是错误的!如果我想测试
是否属于枚举,我必须记住这一点。最简单的方法可能是使用
Enum.class.isAssignableFrom(c)
enum Foo { A{}, B }

public static void main (String[] args) throws java.lang.Exception
{
    System.out.println(Foo.A.getClass().isEnum());
    System.out.println(Foo.B.getClass().isEnum());
}
false
true