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