2010-04-20 18 views
95

Digamos que declara una variable:¿Cómo sabes un tipo de variable en Java?

String a = "test"; 

Y yo quiero saber qué tipo es, es decir, la salida debe ser java.lang.String ¿Cómo se hace esto?

+1

¿Está realmente interesado en el tipo de la variable * *? ¿O le importa el * tipo del valor *? Debido a que el tipo de variable no se puede obtener fácilmente (de hecho, no es posible en absoluto para las variables locales y requiere reflexión para los campos). –

+0

@Joachim, ¿cuál es exactamente la diferencia entre "tipo de variable" y "tipo de valor"? –

+8

@Paul: Considere 'Object o =" o ";' - el tipo de la variable es Object, el tipo del valor es String. –

Respuesta

164
a.getClass().getName() 
+12

Eso le dará el tipo del valor. no necesariamente el tipo de la variable. –

+4

Me imaginé que eso era lo que realmente buscaba el OP, ya que la declaración de 'a' es bastante obvia en el tiempo de compilación – Martin

+2

Eso funcionaría si los tipos no son primitivos ... Si el tipo es int, cómo saber ¿el tipo? –

21

Si desea el nombre, utilice el método de Martin. Si usted quiere saber si se trata de una instancia de una clase determinada:

boolean b = a instanceof String

1

Estoy de acuerdo con lo que dijo Joachim Sauer, no es posible saber (! El tipo de variable no tipo de valor) a menos que su variable es una clase atributo (y tendría que recuperar campos de clase, obtener el campo correcto por nombre ...)

En realidad para mí es totalmente imposible que cualquier método a.xxx().yyy() le da la respuesta correcta ya que la respuesta sería diferente en la exacta mismo objeto, de acuerdo con el contexto en el que llama a este método ...

Como dijo teehoo, si sabe compilar una lista definida de tipos para probar, puede usar instanceof pero también obtendrá las subclases devolviendo verdaderas ...

Una posible solución sería inspirarse en la implementación de java.lang.reflect.Field y cree su propia clase Field, y luego declare todas sus variables locales como esta implementación personalizada Field ... pero será mejor que encuentre otra solución, realmente me pregunto por qué necesita el tipo de variable, y no solo el tipo de valor?

22

Lo aprendí del motor de búsqueda (Mi inglés es muy malo, Código ...) ¿Cómo obtener el tipo de variable? Up:

String str = "test"; 
String type = str.getClass().getName(); 
value: type = java.lang.String 

este método:

str.getClass().getSimpleName(); 
value:String 

ahora ejemplo:

Object o = 1; 
o.getClass().getSimpleName(); 
value:Integer 
14

me gustaría ampliar la respuesta de Martin allí ...

Su solución es bastante agradable, pero se puede ajustar para que cualquier "tipo de variable" pueda imprimirse así. (En realidad Tipo de valor, more on the topic). No está tan ajustado como lo está señalando una posibilidad.

Su solución fue:

a.getClass().getName() 

Si quieres que funcione con cualquier cosa que puede hacer esto:

((Object) myVar).getClass().getName() 
//OR 
((Object) myInt).getClass().getSimpleName() 

En este caso, la primitiva simplemente será envuelto en una envoltura. Obtendrás el Objeto de la primitiva en ese caso.

Yo mismo lo utilizaron como esto:

private static String nameOf(Object o) { 
    return o.getClass().getSimpleName(); 
} 

Uso de medicamentos genéricos: función de sobrecarga

public static <T> String nameOf(T o) { 
    return o.getClass().getSimpleName(); 
} 
3

Uso del operador de java

class Test { 

    void printType(String x) { 
     System.out.print("String"); 
    } 

    void printType(int x) {  
     System.out.print("Int"); 
    } 

    // same goes on with boolean,double,float,object ... 

} 
+4

Java no tiene el concepto de sobrecarga de operador, esto es sobrecarga de método – nicoschl

0

Creo que tenemos varias soluciones aquí:

  • instace de podría ser una solución.

¿Por qué? En Java, todas las clases se heredan de la clase Object. Entonces, si tiene una variable y le gustaría saber el tipo, esto va a funcionar.

  • System.out.println (((Object) f) .getClass(). GetName());

o

  • Integer.class.isInstance (1985); // da cierto

o

  • isPrimitive()

    public static void main(String[] args) { 
    
    ClassDemo classOne = new ClassDemo(); 
    Class classOneClass = classOne(); 
    
    int i = 5; 
    Class iClass = int.class; 
    
    // checking for primitive type 
    boolean retval1 = classOneClass.isPrimitive(); 
    System.out.println("classOneClass is primitive type? = " + retval1); 
    
    // checking for primitive type? 
    boolean retval2 = iClass.isPrimitive(); 
    System.out.println("iClass is primitive type? = " + retval2); 
    } 
    

Esto nos va a dar:

  1. FALSO
  2. VERDADERO

encontrar más información aquí: How to determine the primitive type of a primitive variable?

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

http://docs.oracle.com/cd/E26806_01/wlp.1034/e14255/com/bea/p13n/expression/operator/Instanceof.html

Cuestiones relacionadas