Java es un lenguaje de tipo estático, por lo que el compilador realiza la mayor parte de esta verificación por usted. Una vez que declara que una variable es de cierto tipo, el compilador se asegurará de que solo se le asignen valores de ese tipo (o valores que sean subtipos de ese tipo).
Los ejemplos que proporcionó ( int, array, double) son todos primitivos y no hay subtipos de ellos. Por lo tanto, si declara que una variable es un int:
int x;
Puede estar seguro de que solo tendrá intvalores.
Sin embargo, si declaró que una variable es a List, es posible que la variable contenga subtipos de List. Ejemplos de estos incluyen ArrayList, LinkedList, etc.
Si tiene una Listvariable y necesita saber si es una ArrayList, puede hacer lo siguiente:
List y;...if(y instanceofArrayList){...its and ArrayList...}
Sin embargo, si piensa que debe hacerlo, es posible que desee reconsiderar su enfoque. En la mayoría de los casos, si sigue principios orientados a objetos, no necesitará hacer esto. Sin embargo, existen, por supuesto, excepciones a todas las reglas.
El operador instanceof solo determina el tipo de datos del objeto al que hace referencia la variable. No determina el tipo de datos de la VARIABLE real como se solicitó originalmente.
GrantRobertson
38
En realidad, es bastante fácil hacer rodar su propio probador, abusando de la capacidad de sobrecarga de métodos de Java. Aunque todavía tengo curiosidad por saber si hay un método oficial en el sdk.
Ejemplo:
classTypetester{void printType(byte x){System.out.println(x +" is an byte");}void printType(int x){System.out.println(x +" is an int");}void printType(float x){System.out.println(x +" is an float");}void printType(double x){System.out.println(x +" is an double");}void printType(char x){System.out.println(x +" is an char");}}
luego:
Typetester t =newTypetester();
t.printType( yourVariable );
No es un buen método en mi opinión. ¿Qué sucede si paso algún tipo arbitrario que no está definido en su clase Typetester, en este caso String, por ejemplo?
Tash Pemhiwa
6
@TashPemhiwa luego agregue String y Object a las opciones. La creatividad y la resolución de problemas son los mejores activos de los programadores.
Kato
8
Aún así, esto solo puede tratar con un conjunto fijo de clases predefinidas (que anula el propósito de la orientación / polimorfismo de objetos) y solo le dará algo como "clase desconocida" para objetos de cualquier otra clase
Algoman
3
La elección de qué firma ocurre en tiempo de compilación, no en tiempo de ejecución. Por lo tanto, esta técnica no le dirá nada que no sepa en tiempo de compilación. docs.oracle.com/javase/specs/jls/se7/html/…
jmh
26
a.getClass().getName()- le dará el tipo de datos del objeto real al que se hace referencia a, pero no el tipo de datos con el que ase declaró originalmente la variable o al que se convirtió posteriormente.
boolean b = a instanceof String- le dará si el objeto real al que hace referencia aes una instancia de una clase específica. Una vez más, el tipo de datos con el que ase declaró originalmente la variable o al que posteriormente se convirtió no tiene relación con el resultado del operador instanceof.
Esto puede suceder. Estoy tratando de analizar un Stringen un int y me gustaría saber si mi Integer.parseInt(s.substring(a, b))está echando un int o basura antes de intentar resumirlo.
Puede trabajar con Integer en lugar de int, Double en lugar de double, etc. (tales clases existen para todos los tipos primitivos). Entonces puede usar el operador instanceof, comoif(var instanceof Integer){...}
De esta forma, no es necesario tener varios métodos sobrecargados. Creo que es una buena práctica usar colecciones sobre matrices debido a los beneficios adicionales. Habiendo dicho eso, no sé cómo verificar un tipo de matriz. Quizás alguien pueda mejorar esta solución. ¡Espero que esto ayude!
La primera parte de tu pregunta no tiene sentido. No hay ninguna circunstancia en la que no sepa el tipo de variable primitiva en el momento de la compilación.
Con respecto a la segunda parte, la única circunstancia en la que aún no sabe si una variable es una matriz es si es un objeto. En cuyo caso object.getClass().isArray()te lo diré.
Podría tener un hashmap de cadena a objeto, poner un int en ese hashmap y sacarlo. Lo único que sé es que es un "objeto" y podría tener que verificar de qué tipo es. No digo que sea bueno, solo digo que es posible.
matty-d
5
Lo hice usando: if(x.getClass() == MyClass.class){...}
No estaba contento con ninguna de estas respuestas, y la correcta no tiene explicación y votos negativos, así que busqué, encontré algunas cosas y las edité para que sea fácil de entender. Juega con él, no tan sencillo como uno esperaría.
//move your variable into an Object typeObject obj=whatYouAreChecking;System.out.println(obj);// moving the class type into a Class variableClass cls=obj.getClass();System.out.println(cls);// convert that Class Variable to a neat StringString answer = cls.getSimpleName();System.out.println(answer);
Aquí hay un método:
publicstaticvoid checkClass (Object obj){Class cls = obj.getClass();System.out.println("The type of the object is: "+ cls.getSimpleName());}
Ninguna de estas respuestas funciona si la variable es un tipo genérico no inicializado
Y por lo que puedo encontrar, solo es posible usando una solución extremadamente fea , o pasando un parámetro inicializado a su función, haciéndolo en su lugar, vea aquí:
<T> T MyMethod(...){if(T.class==MyClass.class){...}}
NO es válido porque no puede extraer el tipo del Tparámetro directamente, ya que se borra en tiempo de ejecución.
Esto funciona porque la persona que llama es responsable de crear una instancia de la variable outantes de llamar. Esto todavía generará una excepción si out es nulo cuando se llama, pero en comparación con la solución vinculada, esta es, con mucho, la forma más fácil de hacer esto
Sé que esta es una especie de aplicación específica, pero como este es el primer resultado en Google para encontrar el tipo de variable con Java (y dado que Tes un tipo de variable), creo que debería incluirse
Puede verificarlo fácilmente usando Java.lang.Class.getSimpleName()Método Solo si la variable tiene un tipo no primitivo. No funciona con tipos primitivos int, long, etc.
Una pequeña pista: cuando hay una pregunta que tiene 10 años y tiene> 10 respuestas, de las cuales algunas tienen> 100 votos a favor, entonces es (no imposible pero) muy , muy poco probable que una nueva respuesta pueda agregar algo útil (particularmente, cuando es solo un fragmento de código que dice "Mira, esto imprime algo" ...)
Respuestas:
Java es un lenguaje de tipo estático, por lo que el compilador realiza la mayor parte de esta verificación por usted. Una vez que declara que una variable es de cierto tipo, el compilador se asegurará de que solo se le asignen valores de ese tipo (o valores que sean subtipos de ese tipo).
Los ejemplos que proporcionó (
int
, array,double
) son todos primitivos y no hay subtipos de ellos. Por lo tanto, si declara que una variable es unint
:Puede estar seguro de que solo tendrá
int
valores.Sin embargo, si declaró que una variable es a
List
, es posible que la variable contenga subtipos deList
. Ejemplos de estos incluyenArrayList
,LinkedList
, etc.Si tiene una
List
variable y necesita saber si es unaArrayList
, puede hacer lo siguiente:Sin embargo, si piensa que debe hacerlo, es posible que desee reconsiderar su enfoque. En la mayoría de los casos, si sigue principios orientados a objetos, no necesitará hacer esto. Sin embargo, existen, por supuesto, excepciones a todas las reglas.
fuente
En realidad, es bastante fácil hacer rodar su propio probador, abusando de la capacidad de sobrecarga de métodos de Java. Aunque todavía tengo curiosidad por saber si hay un método oficial en el sdk.
Ejemplo:
luego:
fuente
a.getClass().getName()
- le dará el tipo de datos del objeto real al que se hace referenciaa
, pero no el tipo de datos con el quea
se declaró originalmente la variable o al que se convirtió posteriormente.boolean b = a instanceof String
- le dará si el objeto real al que hace referenciaa
es una instancia de una clase específica. Una vez más, el tipo de datos con el quea
se declaró originalmente la variable o al que posteriormente se convirtió no tiene relación con el resultado del operador instanceof.Tomé esta información de: ¿Cómo sabes un tipo de variable en java?
Esto puede suceder. Estoy tratando de analizar un
String
en un int y me gustaría saber si miInteger.parseInt(s.substring(a, b))
está echando un int o basura antes de intentar resumirlo.Por cierto, esto se conoce como Reflexión. Aquí hay más información sobre el tema: http://docs.oracle.com/javase/tutorial/reflect/
fuente
Puede trabajar con Integer en lugar de int, Double en lugar de double, etc. (tales clases existen para todos los tipos primitivos). Entonces puede usar el operador instanceof, como
if(var instanceof Integer){...}
fuente
Solo usa:
Ejemplo:
Salida:
fuente
randSB
mantiene NULL.Bueno, creo que la verificación del tipo de variable se puede hacer de esta manera.
De esta forma, no es necesario tener varios métodos sobrecargados. Creo que es una buena práctica usar colecciones sobre matrices debido a los beneficios adicionales. Habiendo dicho eso, no sé cómo verificar un tipo de matriz. Quizás alguien pueda mejorar esta solución. ¡Espero que esto ayude!
PD: Sí, sé que esto tampoco busca primitivas.
fuente
La primera parte de tu pregunta no tiene sentido. No hay ninguna circunstancia en la que no sepa el tipo de variable primitiva en el momento de la compilación.
Con respecto a la segunda parte, la única circunstancia en la que aún no sabe si una variable es una matriz es si es un objeto. En cuyo caso
object.getClass().isArray()
te lo diré.fuente
Lo hice usando:
if(x.getClass() == MyClass.class){...}
fuente
No estaba contento con ninguna de estas respuestas, y la correcta no tiene explicación y votos negativos, así que busqué, encontré algunas cosas y las edité para que sea fácil de entender. Juega con él, no tan sencillo como uno esperaría.
Aquí hay un método:
fuente
Ninguna de estas respuestas funciona si la variable es un tipo genérico no inicializado
Y por lo que puedo encontrar, solo es posible usando una solución extremadamente fea , o pasando un parámetro inicializado a su función, haciéndolo en su lugar, vea aquí:
NO es válido porque no puede extraer el tipo del
T
parámetro directamente, ya que se borra en tiempo de ejecución.Esto funciona porque la persona que llama es responsable de crear una instancia de la variable
out
antes de llamar. Esto todavía generará una excepción si out es nulo cuando se llama, pero en comparación con la solución vinculada, esta es, con mucho, la forma más fácil de hacer estoSé que esta es una especie de aplicación específica, pero como este es el primer resultado en Google para encontrar el tipo de variable con Java (y dado que
T
es un tipo de variable), creo que debería incluirsefuente
Puede verificarlo fácilmente usando
Java.lang.Class.getSimpleName()
Método Solo si la variable tiene un tipo no primitivo. No funciona con tipos primitivos int, long, etc.referencia: aquí está el enlace de documentos de Oracle
fuente
Básicamente, por ejemplo:
fuente
clase pública Demo1 {
}
fuente