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 instanceofArrayList){...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.
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:
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");}}
então:
Typetester t =newTypetester();
t.printType( yourVariable );
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.
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.
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){...}
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 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){...}
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 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);
Aqui está um método:
publicstaticvoid 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.
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.
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" ...)
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 comoint
: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 deList
. Exemplos desses incluemArrayList
,LinkedList
etc.Se você tivesse uma
List
variável e precisasse saber se era umArrayList
, você poderia fazer o seguinte: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.
fonte
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:
então:
fonte
a.getClass().getName()
- fornecerá o tipo de dados do objeto real referidoa
, mas não o tipo de dados com o qual a variávela
foi originalmente declarada ou posteriormente convertida.boolean b = a instanceof String
- fornecerá se o objeto real referido pora
é 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
String
em 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/
fonte
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, como
if(var instanceof Integer){...}
fonte
Apenas use:
Exemplo:
Resultado:
fonte
randSB
contiver NULL.Bem, acho que verificar o tipo de variável pode ser feito desta forma.
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.
fonte
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 caso
object.getClass().isArray()
vou te dizer.fonte
Eu fiz isso usando:
if(x.getClass() == MyClass.class){...}
fonte
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.
Aqui está um método:
fonte
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:
NÃO é válido porque você não pode retirar o tipo do
T
parâmetro diretamente, pois ele é apagado em tempo de execução.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 issoEu 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ídofonte
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
fonte
Basicamente, por exemplo:
fonte
public class Demo1 {
}
fonte