检查类是否为java.lang.Enum

Jos*_*ial 63 java enums instanceof

我想知道一个班级是否是一个Enum,但我想我错过了一些东西:

if (test.MyEnum.class instanceof Enum<?>.class)
 obj = resultWrapper.getEnum(i, test.MyEnum.class);
else 
 obj = resultWrapper.getObject(i);
Run Code Online (Sandbox Code Playgroud)

它给我一个错误,说Enum.class无效.那我怎么能检查一个类是否是一个枚举?我很确定有可能确定,我只是无法得到它.

谢谢

Sea*_*oyd 122

正确的语法是:

Enum.class.isAssignableFrom(test.MyEnum.class)
Run Code Online (Sandbox Code Playgroud)

但对于枚举,这是一个更方便的方法:

if (someObject.getClass().isEnum()))
Run Code Online (Sandbox Code Playgroud)

更新:对于具有正文的枚举项(例如,覆盖方法),这实际上不起作用.在那种情况下,使用

if (someObject instanceof Enum<?>)
Run Code Online (Sandbox Code Playgroud)

参考:

  • 小心`isEnum()`.如果您的类是由覆盖方法的枚举值之一创建的匿名类,则返回false. (2认同)
  • 如果枚举中有方法,则枚举的各个值可以覆盖它们.如果覆盖任何这些方法,它会创建一个匿名类,它是枚举的子类.该类的isEnum()返回false.因此,即使EnumClass.class.isEnum()返回true,EnumClass.SOME_VALUE.getClass().isEnum()也可能返回false,因此您必须注意从哪里获取类.例如,如果你正在编写一个实用程序方法供其他人调用,那么使用isEnum()会是一个坏主意,使用Enum.class.isAssignableFrom(clazz)会更安全. (2认同)

Rom*_*man 14

如果您正在谈论Java 5的新功能 - enum (实际上并不是很新),那么这就是要走的路:

if (obj.getClass().isEnum()) {

...
}
Run Code Online (Sandbox Code Playgroud)

如果Enum是您的自定义类,那么只需检查一下obj instanceof Enum.