2010-11-12 25 views
52

J'essaie de savoir si une classe est un Enum, mais je pense que je manque quelque chose:Vérification si une classe est java.lang.Enum

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

Il me donne une erreur disant que Enum .class n'est pas valide. Alors, comment puis-je vérifier si un cours est un Enum? Je suis assez sûr qu'il est possible de déterminer cela, je suis juste incapable de l'obtenir.

Merci

Répondre

89

La syntaxe correcte serait:

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

mais pour les énumérations, voici une méthode plus pratique:

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

Mise à jour: des articles de ENUM avec un corps (par exemple, que override méthodes), cela ne fonctionnera pas réellement. Dans ce cas, utilisez

if (someObject instanceof Enum<?>) 

Référence:

+1

Prenez garde de 'isEnum()'. Il renvoie false si votre classe est une classe anonyme créée par l'une des valeurs enum remplaçant une méthode. – Trejkaz

+0

@Trejkaz pourriez-vous élaborer à ce sujet? Je ne vous suis pas vraiment –

+2

Si vous avez des méthodes dans votre énumération, les valeurs individuelles de l'énumération peuvent les remplacer. Si vous remplacez l'une de ces méthodes, elle crée une classe anonyme qui est une sous-classe de l'énumération. isEnum() pour cette classe renvoie false. Ainsi, même si EnumClass.class.isEnum() renvoie la valeur true, EnumClass.SOME_VALUE.getClass(). IsEnum() peut renvoyer false, vous devez donc faire attention à l'endroit où vous obtenez la classe. Par exemple, si vous étiez en train d'écrire une méthode utilitaire pour les autres, appeler isEnum() serait une mauvaise idée et utiliser Enum.class.isAssignableFrom (clazz) serait plus sûr. – Trejkaz

14

Si vous parlez de Java 5 nouvelle fonctionnalité - enum (ce n'est pas très nouveau en fait), alors c'est la voie à suivre:

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

... 
} 

Si Enum est votre classe personnalisée , puis vérifiez simplement que obj instanceof Enum.

+0

Malheureusement, cela ne fonctionne pas pour:. TimeUnit.SECONDS.getClass() isEnum() – aholub7x