¿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).
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:
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:
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?
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
classTest{void printType(String x){System.out.print("String");}void printType(int x){System.out.print("Int");}// same goes on with boolean,double,float,object ...}
Object o = "o";
: el tipo de la variable es Object, el tipo del valor es String.List<String> l = new ArrayList<String>();
, el tipo de la variable esList<String>
, el tipo del valor esArrayList<String>
.Respuestas:
fuente
a
es bastante obvia en el momento de la compilaciónint
valor es en unaint
variable, no hay forma de escribir código que maneje unint
valor y no conozca ese tipo. El asunto es diferente en caso de que esté manejando un contenedor comoInteger
, pero luego el código de esta respuesta funciona nuevamente.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
fuente
Double a = 1d; boolean b = a instanceof String;
causará un errorerror: incompatible types: Double cannot be converted to String
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:
Sin embargo, si desea que funcione con cualquier cosa, puede hacer esto:
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í:
Usando genéricos:
fuente
Aprendí del motor de búsqueda (mi inglés es muy malo, así que código ...) ¿Cómo obtener el tipo de variable? UPS :
este método :
ahora ejemplo:
fuente
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.Field
y crear su propiaField
clase, y luego declarar todas sus variables locales como estaField
implementació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?fuente
Utilice la función de sobrecarga del operador de java
fuente
Creo que tenemos múltiples soluciones aquí:
¿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
o
o
isPrimitive ()
Esto nos va a dar:
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
fuente