2012-09-11 23 views
29

¿Existe una función tipo "tipo de letra" en Java que devuelve el tipo de una variable de tipo de datos primitivo (PDT) o una expresión de operandos PDT?¿Cómo determinar el tipo primitivo de una variable primitiva?

instanceof parece funcionar solo para tipos de clase.

+1

¿Está buscando una 'Clase 'que represente' int', 'long' y así sucesivamente? – dasblinkenlight

+3

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

+0

@ Thor84no sí, puedes con la reflexión – Bohemian

Respuesta

50

intente lo siguiente:

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

se imprimirá:

java.lang.Integer 
java.lang.Float 

En cuanto a instanceof, podría utilizar su contraparte dinámica Class#isInstance:

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

aún no lo han intentado, pero esto es lo que estoy buscando. Gracias. – ashley

13

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.

Cuestiones relacionadas