2010-11-12 11 views
52

Próbuję się dowiedzieć, czy klasa jest Enum, ale myślę, że czegoś brakuje:sprawdzenie, czy klasa jest java.lang.Enum

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

Daje mi błąd mówiąc, że Enum .class jest nieprawidłowy. Więc jak mogę sprawdzić, czy klasa jest Enum? Jestem prawie pewien, że można to ustalić, po prostu nie mogę tego zdobyć.

Dzięki

Odpowiedz

89

Poprawna składnia byłoby:

Enum.class.isAssignableFrom(test.MyEnum.class) 

ale za teksty stałe, tutaj jest bardziej wygodny sposób:

if (someObject.getClass().isEnum())) 

Update: dla elementów enum z organizmu (np które zastępują metody), to nie zadziała. W takim przypadku należy użyć

if (someObject instanceof Enum<?>) 

referencyjny:

+1

Strzeżcie z 'isEnum()'. Zwraca wartość false, jeśli twoja klasa jest anonimową klasą utworzoną przez jedną z wartości wyliczeniowych przesłaniających metodę. – Trejkaz

+0

@Trejkaz mógłbyś to rozwinąć? Nie podążam za tobą –

+2

Jeśli masz metody w swoim wyliczeniu, poszczególne wartości wyliczenia mogą je zastąpić. Jeśli zastąpisz którąkolwiek z tych metod, tworzy ona anonimową klasę, która jest podklasą enum. isEnum() dla tej klasy zwraca false. Tak więc, nawet jeśli EnumClass.class.isEnum() zwraca wartość true, EnumClass.SOME_VALUE.getClass(). IsEnum() może zwrócić wartość false, więc musisz być ostrożny, skąd bierzesz klasę. Na przykład, jeśli piszesz metodę narzędziową dla innych, aby wywołać, użycie isEnum() byłoby złym pomysłem i użycie Enum.class.isAssignableFrom (clazz) byłoby bezpieczniejsze. – Trejkaz

14

Jeśli mówisz Java 5 nowa funkcja - enum (to nie jest bardzo nowy faktycznie), to jest do zrobienia:

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

... 
} 

Jeśli Enum jest klasa zwyczaj , po prostu sprawdź, czy obj instanceof Enum.

+0

Niestety to nie działa. TimeUnit.SECONDS.getClass() isEnum() – aholub7x

Powiązane problemy