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?
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?
Respostas:
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.
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 );
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/
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){...}
Apenas use:
.getClass().getSimpleName();
Exemplo:
StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());
Resultado:
StringBuilder
randSBcontiver NULL.
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.
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.
Eu fiz isso usando: if(x.getClass() == MyClass.class){...}
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());
}
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
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
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
}
}