2012-09-11 10 views
29

Esiste una funzione simile a "typeof" in Java che restituisce il tipo di una variabile di tipo di dati primitivi (PDT) o un'espressione di operandi PDT?Come determinare il tipo primitivo di una variabile primitiva?

instanceof sembra funzionare solo per i tipi di classe.

+1

Stai cercando un 'Class' che rappresenta' int', 'long' e così via? – dasblinkenlight

+3

Non è possibile avere un tipo di dati primitivo senza conoscerne il tipo. Dovrebbe essere inserito in un tipo 'Numero' in modo che tu non lo sappia, nel qual caso puoi usare' instanceof'. – Thor84no

+0

@ Thor84no sì, è possibile con la riflessione – Bohemian

risposta

50

provare quanto segue:

int i = 20; 
float f = 20.2f; 
System.out.println(((Object)i).getClass().getName()); 
System.out.println(((Object)f).getClass().getName()); 

verrà stampata:

java.lang.Integer 
java.lang.Float 

Quanto a instanceof, si potrebbe usare la sua controparte dinamica Class#isInstance:

Integer.class.isInstance(20); // true 
Integer.class.isInstance(20f); // false 
Integer.class.isInstance("s"); // false 
+0

havent ancora provato ma questo è quello che sto cercando. Grazie. – ashley

13

C'è un modo semplice che non richiede la boxe implicita, quindi non ti confonderai tra i primitivi e i loro involucri. Non è possibile utilizzare isInstance per tipi primitivi, ad es. chiamando Integer.TYPE.isInstance(5) (Integer.TYPE equivale a int.class) restituirà false come 5 è attivato automaticamente in un Integer prima mano.

Il modo più semplice per ottenere ciò che si desidera (nota: è tecnicamente eseguito in fase di compilazione per le primitive, ma richiede comunque la valutazione dell'argomento) tramite sovraccarico. Vedi il mio ideone paste.

... 

public static Class<Integer> typeof(final int expr) { 
    return Integer.TYPE; 
} 

public static Class<Long> typeof(final long expr) { 
    return Long.TYPE; 
} 

... 

questo può essere usato come segue, per esempio:

System.out.println(typeof(500 * 3 - 2)); /* int */ 
System.out.println(typeof(50 % 3L)); /* long */ 

Questa si basa sulla capacità del compilatore per determinare il tipo di espressione e di scegliere il sovraccarico di destra.

Problemi correlati