¿Cómo verificar el tipo de variable en Java?

120

¿Cómo puedo verificar para asegurarme de que mi variable sea un int, array, double, etc.?

Editar: Por ejemplo, ¿cómo puedo verificar que una variable sea una matriz? ¿Hay alguna función para hacer esto?

fresa
fuente
Eche un vistazo a la API de Reflection .
mschonaker
Pregunta muy relacionada con respuestas aquí: stackoverflow.com/questions/2674554/… .
A.Alessio

Respuestas:

111

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 instanceof ArrayList) { 
  ...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.

pkaeding
fuente
3
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:

class Typetester {
    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 = new Typetester();
t.printType( yourVariable );
Mvcoile
fuente
21
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.

Tomé esta información de: ¿Cómo sabes un tipo de variable en java?

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.

Por cierto, esto se conoce como Reflexión. Aquí hay más información sobre el tema: http://docs.oracle.com/javase/tutorial/reflect/

Glen Pierce
fuente
14

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){...}

Alex Abdugafarov
fuente
2
Todo lo que necesitamos es un caso de uso válido.
Marqués de Lorne
Suena como el enfoque más eficiente.
I.Tyger
13

Solo usa:

.getClass().getSimpleName();

Ejemplo:

StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());

Salida:

StringBuilder
Debayan
fuente
1
Sugiero señalar que esto no funciona si se randSBmantiene NULL.
Basil Bourque
8

Bueno, creo que la verificación del tipo de variable se puede hacer de esta manera.

public <T extends Object> void checkType(T object) {    
    if (object instanceof Integer)
        System.out.println("Integer ");
    else if(object instanceof Double)
        System.out.println("Double ");
    else if(object instanceof Float)
        System.out.println("Float : ");
    else if(object instanceof List)
        System.out.println("List! ");
    else if(object instanceof Set)
        System.out.println("Set! ");
}

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.

Amogh
fuente
6

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

Marqués de Lorne
fuente
5
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){...}

Vinicius Arruda
fuente
2

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 type
Object obj=whatYouAreChecking;
System.out.println(obj);

// moving the class type into a Class variable
Class cls=obj.getClass();
System.out.println(cls);

// convert that Class Variable to a neat String
String answer = cls.getSimpleName();
System.out.println(answer);

Aquí hay un método:

public static void checkClass (Object obj) {
    Class cls = obj.getClass();
    System.out.println("The type of the object is: " + cls.getSimpleName());       
}
Neil Regan
fuente
1

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.

<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}

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

iggy12345
fuente
0

Básicamente, por ejemplo:

public class Kerem
{
    public static void main(String[] args)
    {
        short x = 10;
        short y = 3;
        Object o = y;
        System.out.println(o.getClass()); // java.lang.Short
    }

}
Doktor
fuente
1
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" ...)
Marco13
-4

clase pública Demo1 {

Object printType(Object o)
{
    return o;
}
 public static void main(String[] args) {

    Demo1 d=new Demo1();
    Object o1=d.printType('C');
    System.out.println(o1.getClass().getSimpleName());

}

}

Dev
fuente