2009-05-05 7 views
8

J'essaie de déterminer le type de classe d'une classe en utilisant la réflexion, puis de faire quelque chose de spécifique. Par exemple, si la classe est un double, utilisez une méthode double spécifique.Comment comparer des classes en utilisant la réflexion?

Je cherche à utiliser


    if(f.getClass() == Double.class) 

Cependant, je reçois une erreur de compilation:

"? Incompatible types d'opérandes Classe < capture # 1 de étend le terrain > et classe <Double>"

Quelle est la bonne façon de faire cela?

Edit: pour être plus clair

f est de type champ. obtenue par réflexion dans une boucle


    (Field f : instance.getDeclaredFields()) 

Répondre

6

message d'erreur intéressante (je ne savais pas '==' opérateur vérifierait les). Mais sur la base de cela, je soupçonne que votre comparaison est fausse: vous essayez de voir si la classe Field (théoriquement sa super-classe, mais seulement en théorie - Field est final) est la même que Double.class, ce qu'elle ne peut pas être. Donc: oui, la comparaison devrait fonctionner, si vous lui donnez les bons arguments. Donc, je pense que vous voulez faire:

if (f.getType() == Double.class) au lieu

. Et cela devrait fonctionner, étant donné que Double est une classe finale. Sinon "isAssignableFrom" serait plus approprié.

1

La façon la plus simple serait

if (f.getClass().equals(Double.class)) 

Edit: Ah, maintenant je vois le problème. L'erreur que vous obteniez était parce que (à la suite des génériques) le compilateur pourrait dire que les classes ne seraient jamais égales (Field.class ne peut pas égaler Double.class). L'utilisation de .equals() le transforme en un avertissement au lieu d'une erreur, mais le code est toujours incorrect.

Field.getType() vous donne le type du champ. Comme cela ne peut pas être connu au moment de la compilation, vous n'obtiendrez pas d'erreur si vous utilisez l'opérateur == comme vous l'avez fait à l'origine.

+0

Cela ne fonctionne pas comme je le voudrais. Merci pour l'aide, j'ai trébuché sur la réponse et l'ai posté. – kgrad

3

Si vous avez des objets puis utilisez

if (f instanceof Double) { } 

Une autre chose intéressante est la méthode IsAssignableFrom:

if (f.getClass().isAssignableFrom (Double.class)) { } 

Mais en général, il est un mauvais style. Utilisez le polymorphisme pour implémenter une logique qui dépend des types de classe.


Réponse pour comment: f instanceof Double fonctionne bien.

Vous avez sans doute écrit quelque chose comme ceci:

float f = 1.1f; 
if (f instanceof Double) { ..} 

Et compilateur intelligent java dit que vous avez CE. MAIS:

public static boolean isInstanceOfDouble (Object obj) { 
    return obj instanceof Double; 
} 

psvm (String [] args) { 
    sout (isInstanceOfDouble (1.1f); 
} 

..ce fonctionne très bien

+0

Ce n'est pas toujours la même chose. Si Double n'était pas une classe finale, les deux seraient différents si f était une sous-classe. –

+0

f instanceof Double donne une erreur de compilation. – kgrad

+0

Oui, comme vous pouvez le voir, j'ai écrit "intéressant", cela signifie "lire javadocs pour plus de détails". En tout cas je préfère les solutions OOP – Roman

1

Vous devez utiliser getType() pour obtenir le type sous-jacent, ne se classe. getType() renvoie la classe du type sous-jacent tel que requis.

le code ressemble à ceci:


    if(f.getType().equals(Double.class)) 
+0

Voilà la réponse à une question complètement différente. getType() est spécifique à la classe Field, alors que getClass() s'applique à tous les objets. –

+0

La question est spécifique à la réflexion ... – kgrad

+0

Mais avez-vous remarqué que Roman et moi avons donné des réponses qui n'avaient pas de sens? Nous répondions tous les deux à votre question initiale. (J'ai mis à jour ma réponse pour expliquer le vrai problème ici.) –

0

Après l'extrait de code doit fonctionner parfaitement:

if (f.getType() == Double.TYPE) 

BTW, ni == ni equals œuvres pour Nombre types selon mon test (JRE7)

Questions connexes