2009-05-05 12 views
8

Sto provando a determinare il tipo di classe di una classe usando la riflessione e poi faccio qualcosa di specifico. Ad esempio, se la classe è un doppio, utilizzare un doppio metodo specifico.Come si confrontano le classi usando la riflessione?

Sto tentando di usare


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

Tuttavia, sto ottenendo un errore di compilazione:

"? Tipi di operando incompatibili Class < capture # 1-su si estende Campo > e Classe <doppio>"

Qual è il modo corretto per farlo?

Edit: per essere più chiaro

f è di tipo Field. ottenuta dalla riflessione in un ciclo


    (Field f : instance.getDeclaredFields()) 

risposta

6

messaggio di errore Interessante (non sapevo '==' operatore dovrebbe controllare quelli). Ma sulla base di ciò, sospetto che il tuo confronto sia sbagliato: stai cercando di vedere se la classe Field (teoricamente la sua super-classe, ma solo in teoria - Field is final) è la stessa di Double.class, che non può essere.

Quindi: sì, il confronto dovrebbe funzionare, se si danno gli argomenti giusti. Così ho il sospetto che si vuole fare:

se (f.getType() == Double.class)

invece. E questo dovrebbe funzionare, dato che Double è una classe finale. Altrimenti "isAssignableFrom" sarebbe più appropriato.

1

Il modo più semplice sarebbe

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

Edit: Ah, ora vedo il problema. L'errore che stavi ottenendo era dovuto al fatto che (come risultato di generici) il compilatore poteva dire che le classi non sarebbero mai state uguali (Field.class non può essere uguale a Double.class). L'uso di .equals() lo trasforma in un avvertimento invece di un errore, ma è sempre un codice errato.

Field.getType() fornisce il tipo di campo. Poiché questo non può essere conosciuto in fase di compilazione, non si otterrà un errore se si utilizza l'operatore == come in origine.

+0

Questo non funziona il modo in cui mi piacerebbe. Grazie per l'aiuto, mi sono imbattuto nella risposta e l'ho postata. – kgrad

3

Se hai oggetti quindi utilizzare

if (f instanceof Double) { } 

Un'altra cosa interessante è il metodo isAssignableFrom:

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

Ma in generale si tratta di un cattivo stile. Usa il polimorfismo per implementare la logica che dipende dai tipi di classe.


Risposta per commento: f instanceof Double funziona bene.

Probabilmente ha scritto qualcosa di simile:

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

e Smart java compilatore dice che hai CE. MA:

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

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

..questo funziona bene

+0

Non è sempre la stessa cosa. Se Double non fosse una classe finale, i due sarebbero diversi se f fosse una sottoclasse. –

+0

L'istanza di Double fornisce un errore del compilatore. – kgrad

+0

Sì, come puoi vedere ho scritto "interessante", significa "leggi javadoc per maggiori dettagli". In ogni caso preferisco le soluzioni OOP – Roman

1

Si deve usare getType() per ottenere il tipo di fondo, non ottiene di classe. getType() restituisce la classe del tipo sottostante come richiesto.

il codice simile a questo:


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

Questa è la risposta a una domanda completamente diversa. getType() è specifico per la classe Field, mentre getClass() si applica a tutti gli oggetti. –

+0

La domanda è specifica per la riflessione ... – kgrad

+0

Ma avete notato che sia io che Roman abbiamo dato risposte che non avevano senso? Entrambi stavamo rispondendo alla tua domanda originale. (Ho aggiornato la mia risposta per spiegare il vero problema qui.) –

0

seguente frammento di codice dovrebbe funzionare perfettamente:

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

BTW, né ==equals lavori per Numero tipi secondo il mio test (JRE7)

Problemi correlati