Hay una manera fácil de que no necesita el boxeo implícito, por lo que no te confundirás entre primitivos y sus envolturas. No puede usar isInstance
para tipos primitivos, p. llamar Integer.TYPE.isInstance(5)
(Integer.TYPE
es equivalente a int.class
) devolverá false
como 5
se autoboxed en un Integer
de antemano.
La forma más fácil de obtener lo que desea (obsérvese que técnicamente se realiza en tiempo de compilación para primitivos, pero todavía requiere la evaluación del argumento) es a través de la sobrecarga. Ver mi ideone paste.
...
public static Class<Integer> typeof(final int expr) {
return Integer.TYPE;
}
public static Class<Long> typeof(final long expr) {
return Long.TYPE;
}
...
Esto se puede utilizar de la siguiente manera, por ejemplo:
System.out.println(typeof(500 * 3 - 2)); /* int */
System.out.println(typeof(50 % 3L)); /* long */
Esto se basa en la capacidad del compilador para determinar el tipo de la expresión y recoger la sobrecarga de la derecha.
¿Está buscando una 'Clase 'que represente' int', 'long' y así sucesivamente? – dasblinkenlight
No puede tener un tipo de datos primitivo sin saber el tipo de él. Debería estar encajonado en un tipo 'Number' para que no lo sepas, en cuyo caso puedes usar' instanceof'. – Thor84no
@ Thor84no sí, puedes con la reflexión – Bohemian