isEnum() 无法识别 java.lang.Enum

Jok*_*ker 4 java enums

isEnum()对于在 java 中定义的 enum 工作绝对正常class

令我惊讶的是,如果失败了java.lang.Enum.class.isEnum()

以下代码产生true , false作为输出,但是我期待true , true

public class Test {
        public static void main(String[] args) {
            System.out.println(Color.class.isEnum());
            System.out.println(java.lang.Enum.class.isEnum());
        }
    }

    enum Color {
        RED, GREEN, BLUE;
    }
Run Code Online (Sandbox Code Playgroud)

为什么会isEnum()这样?

Cas*_*der 7

你可以很容易地在Enum源代码中看到java.lang.Enum它实际上是一个class

public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {
//...
}
Run Code Online (Sandbox Code Playgroud)


ern*_*t_k 5

isEnum()状态文档:

当且仅当此类在源代码中被声明为枚举时才返回 true。

java.lang.Enum 被声明为

public abstract class Enum<E extends Enum<E>>...
Run Code Online (Sandbox Code Playgroud)

因此,根据定义,它不是枚举。除此之外,的实现isEnum()还给出了另一个提示:

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;
}
Run Code Online (Sandbox Code Playgroud)

java.lang.Enum.class 不会通过最后一次检查