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.
Stai cercando un 'Class' che rappresenta' int', 'long' e così via? – dasblinkenlight
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
@ Thor84no sì, è possibile con la riflessione – Bohemian