Como verificar o tipo de variável em Java?

120

Como posso verificar se minha variável é um int, array, double, etc ...?

Edit: Por exemplo, como posso verificar se uma variável é uma matriz? Existe alguma função para fazer isso?

morango
fonte
Dê uma olhada na API do Reflection .
mschonaker
Pergunta muito relacionada com respostas aqui: stackoverflow.com/questions/2674554/… .
A.Alessio

Respostas:

111

Java é uma linguagem com tipagem estática, portanto, o compilador faz a maior parte dessa verificação para você. Depois de declarar uma variável como um determinado tipo, o compilador garantirá que ela só receba valores desse tipo (ou valores que são subtipos desse tipo).

Os exemplos que você deu ( int, array, double) são todos primitivos e não há subtipos deles. Assim, se você declarar uma variável como int:

int x;

Você pode ter certeza que só vai durar int valores.

Se você declarou uma variável como a List, no entanto, é possível que a variável contenha subtipos de List. Exemplos desses incluem ArrayList,LinkedList etc.

Se você tivesse uma Listvariável e precisasse saber se era um ArrayList, você poderia fazer o seguinte:

List y;
...
if (y instanceof ArrayList) { 
  ...its and ArrayList...
}

No entanto, se você estiver pensando que precisa fazer isso, você pode querer repensar sua abordagem. Na maioria dos casos, se você seguir os princípios orientados a objetos, não precisará fazer isso. Existem, é claro, exceções a todas as regras.

pkaeding
fonte
3
O operador instanceof apenas determina o tipo de dados do objeto referido pela variável. Ele não determina o tipo de dados da VARIABLE real conforme solicitado originalmente.
GrantRobertson
38

Na verdade, é muito fácil lançar seu próprio testador, abusando da capacidade de sobrecarga de método do Java. Embora eu ainda esteja curioso para saber se existe um método oficial no SDK.

Exemplo:

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");
    }
}

então:

Typetester t = new Typetester();
t.printType( yourVariable );
Mvcoile
fonte
21
Não é um bom método IMO. O que acontecerá se eu passar algum tipo arbitrário que não está definido em sua classe Typetester - nesta instância String, por exemplo?
Tash Pemhiwa
6
@TashPemhiwa então adicione String e Object às escolhas. Criatividade e resolução de problemas são as melhores qualidades do programador.
Kato
8
Ainda assim, isso só pode lidar com um conjunto fixo de classes predefinidas (o que anula o propósito de orientação a objetos / polimorfismo) e só vai dar a você algo como "classe desconhecida" para objetos de qualquer outra classe
Algoman
3
A escolha de qual assinatura ocorre em tempo de compilação, não em tempo de execução. Portanto, essa técnica não dirá nada que você ainda não saiba em tempo de compilação. docs.oracle.com/javase/specs/jls/se7/html/…
jmh
26

a.getClass().getName()- fornecerá o tipo de dados do objeto real referido a, mas não o tipo de dados com o qual a variável afoi originalmente declarada ou posteriormente convertida.

boolean b = a instanceof String- fornecerá se o objeto real referido por aé ou não uma instância de uma classe específica. Novamente, o tipo de dados que a variávela foi originalmente declarada ou posteriormente convertida não tem relação com o resultado do operador instanceof.

Peguei essa informação de: Como você conhece um tipo de variável em java?

Isso pode acontecer. Estou tentando analisar um Stringem um int e gostaria de saber se meuInteger.parseInt(s.substring(a, b)) expulsando um int ou lixo antes de tentar resumir.

A propósito, isso é conhecido como Reflexão. Aqui estão mais algumas informações sobre o assunto: http://docs.oracle.com/javase/tutorial/reflect/

Glen Pierce
fonte
14

Você pode trabalhar com Integer em vez de int, Double em vez de double, etc. (essas classes existem para todos os tipos primitivos). Então você pode usar o operador instanceof, comoif(var instanceof Integer){...}

Alex Abdugafarov
fonte
2
Tudo o que precisamos é um caso de uso válido.
Marquês de Lorne,
Parece a abordagem mais eficiente.
I. Tyger
13

Apenas use:

.getClass().getSimpleName();

Exemplo:

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

Resultado:

StringBuilder
Debayan
fonte
1
Sugiro observar que isso não funciona se randSBcontiver NULL.
Basil Bourque
8

Bem, acho que verificar o tipo de variável pode ser feito desta forma.

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! ");
}

Dessa forma, você não precisa ter vários métodos sobrecarregados. Acho que é uma boa prática usar coleções em vez de arrays devido aos benefícios adicionais. Dito isso, não sei como verificar um tipo de array. Talvez alguém possa melhorar esta solução. Espero que isto ajude!

PS Sim, eu sei que isso não verifica os primitivos também.

Amogh
fonte
6

A primeira parte da sua pergunta não tem sentido. Não há nenhuma circunstância em que você não saiba o tipo de uma variável primitiva em tempo de compilação.

Quanto à segunda parte, a única circunstância em que você ainda não sabe se uma variável é um array é se ela é um objeto. Nesse casoobject.getClass().isArray() vou te dizer.

Marquês de Lorne
fonte
5
Eu poderia ter um hashmap de string para objeto, colocar um int nesse hashmap e puxá-lo de volta. A única coisa que sei é que é um "objeto" e poderia ter que verificar de que tipo é. Não estou dizendo que é bom, apenas dizendo que é possível.
matty-d
5

Eu fiz isso usando: if(x.getClass() == MyClass.class){...}

Vinicius Arruda
fonte
2

Eu não fiquei feliz com nenhuma dessas respostas, e a que está certa não tem explicação e votos negativos então eu pesquisei, encontrei algumas coisas e editei para que fosse fácil de entender. Divirta-se com ele, não tão direto como se poderia esperar.

//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);

Aqui está um 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
fonte
1

Nenhuma dessas respostas funciona se a variável for um tipo genérico não inicializado

E pelo que pude descobrir, só é possível usando uma solução alternativa extremamente feia ou passando um parâmetro inicializado para sua função, tornando-o no local, veja aqui:

<T> T MyMethod(...){ if(T.class == MyClass.class){...}}

NÃO é válido porque você não pode retirar o tipo do Tparâmetro diretamente, pois ele é apagado em tempo de execução.

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

Isso funciona porque o chamador é responsável por instanciar a variável out antes de chamar. Isso ainda lançará uma exceção se out for nulo quando chamado, mas em comparação com a solução vinculada, esta é de longe a maneira mais fácil de fazer isso

Eu sei que este é um tipo de aplicativo específico, mas como este é o primeiro resultado no google para encontrar o tipo de uma variável com java (e dado que Té um tipo de variável), acho que deveria ser incluído

iggy12345
fonte
0

Você pode verificar isso facilmente usando Java.lang.Class.getSimpleName()Method Only se a variável tiver tipo não primitivo. Não funciona com tipos primitivos inteiros, longos etc.

referência - Aqui está o link de documentos da Oracle

GeekyCoder
fonte
0

Basicamente, por exemplo:

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
fonte
1
Uma pequena dica: quando há uma pergunta que tem 10 anos e tem> 10 respostas, das quais algumas têm> 100 votos positivos, então é (não impossível, mas) muito , muito improvável que uma nova resposta possa adicionar algo útil (particularmente, quando é apenas um trecho de código que diz "Aqui, olha, isso imprime algo" ...)
Marco13
-4

public class 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
fonte