¿Cómo sabes un tipo de variable en Java?

152

Digamos que declaro una variable:

String a = "test";

Y quiero saber de qué tipo es, es decir, la salida debería ser java.lang.String¿Cómo hago esto?

Miguel Ribeiro
fuente
1
¿Estás realmente interesado en el tipo de variable ? ¿O te importa el tipo de valor ? Debido a que el tipo de la variable no se puede obtener fácilmente (de hecho, no es posible para las variables locales y requiere reflexión para los campos).
Joachim Sauer el
8
@Paul: considere Object o = "o";: el tipo de la variable es Object, el tipo del valor es String.
Michael Borgwardt
2
@Paul In List<String> l = new ArrayList<String>();, el tipo de la variable es List<String>, el tipo del valor es ArrayList<String>.
Ben Lings
1
@Ben Lings El tipo de variable es java.util.ArrayList y el tipo de valor es java.util.ArrayList.
Ajay Takur
1
@AjayThakur: es la diferencia entre el tipo de tiempo de compilación (estático) y el tipo de tiempo de ejecución (dinámico).
Ben Lings

Respuestas:

269
a.getClass().getName()
Martín
fuente
16
Eso le dará el tipo del valor. no necesariamente el tipo de la variable.
Joachim Sauer el
77
Me imaginé que eso era lo que realmente buscaba el OP ya que la declaración de aes bastante obvia en el momento de la compilación
Martin
44
Eso funcionaría si los tipos no son primitivos ... Si el tipo es int, ¿cómo saberlo?
Miguel Ribeiro
55
@Miguel: dado que la única forma en que puede manejar un intvalor es en una intvariable, no hay forma de escribir código que maneje un intvalor y no conozca ese tipo. El asunto es diferente en caso de que esté manejando un contenedor como Integer, pero luego el código de esta respuesta funciona nuevamente.
Joachim Sauer
1
Esto no es cierto para un tipo primitivo.
Mehdi
37

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

boolean b = a instanceof String

Martin Konecny
fuente
15
¿no eres Martin también? :)
seokhoonlee
El otro Martin ... LOL;)
chankruze
Este código Double a = 1d; boolean b = a instanceof String;causará un errorerror: incompatible types: Double cannot be converted to String
Alex78191
35

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

Su solución es bastante buena, pero se puede ajustar para que cualquier "tipo de variable" se pueda imprimir de esa manera (en realidad es Tipo de valor, más sobre el tema ). Dicho esto, "ajustado" puede ser una palabra fuerte para esto. De todos modos, puede ser útil.

Solución Martins:

a.getClass().getName()

Sin embargo, si desea que funcione con cualquier cosa, puede hacer esto:

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

En este caso, la primitiva simplemente se envolverá en una envoltura. Obtendrá el Objeto de la primitiva en ese caso.

Yo mismo lo usé así:

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

Usando genéricos:

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}
Atspulgs
fuente
Interesante. Acabo de probar su código en: System.out.println (((Object) Integer.parseInt ("12")) .getClass (). GetSimpleName ()); ¡y funciona! \ o /
shevy
31

Aprendí del motor de búsqueda (mi inglés es muy malo, así que código ...) ¿Cómo obtener el tipo de variable? UPS :

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
Copiar pegar
fuente
3

Estoy de acuerdo con lo que dijo Joachim Sauer, no es posible saberlo (¡el tipo de variable! ¡No el tipo de valor!) A menos que su variable sea un atributo de clase (y tendría que recuperar los campos de clase, obtener el campo correcto por nombre ...)

En realidad, para mí es totalmente imposible que cualquier a.xxx().yyy()método le dé la respuesta correcta, ya que la respuesta sería diferente en el 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á subclases que devuelven verdadero ...

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

Sebastien Lorber
fuente
Para "pero también obtendrás subclases que devuelven verdadero ..." , creo que quisiste decir "pero también obtendrás clases para padres que devuelven verdadero ..." , ¿verdad?
skomisa
3

Utilice la función de sobrecarga 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 ...

}
epicwhat001
fuente
8
Java no tiene el concepto de sobrecarga de operadores, esta es la sobrecarga de métodos
nicoschl
2

Creo que tenemos múltiples soluciones aquí:

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

¿Por qué? En Java, cada clase se hereda de la clase Object en sí. Entonces, si tiene una variable y le gustaría saber su tipo. Puedes usar

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

o

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

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. CIERTO

Obtenga más información aquí: ¿Cómo determinar el tipo primitivo de una variable primitiva?

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

Karoly
fuente