根据我的理解,对于使用Class.isEnum()
语句声明的任何枚举值,enum
应该返回true。
如果枚举声明为enum,则返回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())));
}
}
}
如果我的理解是对的,请检查并告诉我。
答案 0 :(得分:3)
如果我的理解是正确的,Class#isEnum()
并非旨在检查某个类是否为枚举。它只是让你反省类声明。
如评论中所述,
可以轻松实现您想要做的事情yourEnumValue.getClass().isAssignableFrom(Enum.class)
或
yourEnumValue instanceof Enum
答案 1 :(得分:1)
您的理解是正确的,您需要enumWorkaround
检查第三个值是否为枚举。检查isEnum
的代码:
它检查枚举位和超类。这意味着如果你有一个不直接从enumWorkaround
继承的具体类,你的java.lang.Enum
可能仍会失败,但我想这对于枚举常量是不可能的......