Você está realmente interessado no tipo da variável ? Ou você se importa com o tipo do valor ? Como o tipo da variável não pode ser facilmente obtido (na verdade, não é possível para variáveis locais e requer reflexão para os campos).
Joachim Sauer
8
@ Paul: Considere Object o = "o";- o tipo da variável é Object, o tipo do valor é String.
precisa
2
@Paul In List<String> l = new ArrayList<String>();, o tipo da variável é List<String>, o tipo do valor é ArrayList<String>.
Ben Lings
1
@Ben Lings O tipo de variável é java.util.ArrayList e o tipo de valor é java.util.ArrayList.
Ajay Takur
1
@AjayThakur - é a diferença entre o tipo de tempo de compilação (estático) e o tipo de tempo de execução (dinâmico).
Isso dará o tipo do valor. não necessariamente o tipo da variável.
Joachim Sauer
7
Eu só percebi que era o que o OP estava realmente procurando desde a declaração de aé bastante óbvio em tempo de compilação
Martin
4
Isso funcionaria se os tipos não fossem primitivos ... Se o tipo for int, como saber o tipo?
Miguel Ribeiro
5
@ Miguel: uma vez que a única maneira de lidar com um intvalor é em uma intvariável, não há como escrever código que lide com um intvalor e não conheça esse tipo. O problema é diferente caso você esteja lidando com um invólucro Integer, mas o código desta resposta funcionará novamente.
Joachim Sauer
1
isso não é verdade para um tipo primitivo.
Mehdi
37
Se você quiser o nome, use o método de Martin. Se você deseja saber se é uma instância de uma determinada classe:
Código Thic Double a = 1d; boolean b = a instanceof String;causará erroerror: incompatible types: Double cannot be converted to String
Alex78191 20/02
35
Gostaria de expandir a resposta de Martin lá ...
Sua solução é bastante boa, mas pode ser alterada para que qualquer "tipo de variável" possa ser impresso dessa maneira (na verdade, é Value Type, mais sobre o tópico ). Dito isto, "tweaked" pode ser uma palavra forte para isso. Independentemente disso, pode ser útil.
Solução Martins:
a.getClass().getName()
No entanto, se você deseja que ele funcione com qualquer coisa, você pode fazer isso:
Interessante. Eu apenas tentei seu código em: System.out.println (((Object) Integer.parseInt ("12")) .getClass (). GetSimpleName ()); e funciona! \ o /
shevy
31
Aprendi com o mecanismo de pesquisa (meu inglês é muito ruim, então código ...) Como obter o tipo de variável? Ups :
String str ="test";String type = str.getClass().getName();
value: type = java.lang.String
este método :
str.getClass().getSimpleName();
value:String
agora exemplo:
Object o =1;
o.getClass().getSimpleName();
value:Integer
Concordo com o que Joachim Sauer disse, não é possível saber (o tipo de variável! Não o tipo de valor!), A menos que sua variável seja um atributo de classe (e você teria que recuperar os campos da classe, obter o campo correto pelo nome ...)
Na verdade, para mim, é totalmente impossível que qualquer a.xxx().yyy()método lhe dê a resposta certa, pois a resposta seria diferente no mesmo objeto, de acordo com o contexto em que você chama esse método ...
Como teehoo disse, se você souber compilar uma lista definida de tipos para testar, poderá usar instanceof, mas também obterá subclasses retornando true ...
Uma solução possível seria também se inspirar na implementação java.lang.reflect.Fielde criar sua própria Fieldclasse e declarar todas as suas variáveis locais como essa Fieldimplementação personalizada ... mas é melhor você encontrar outra solução, eu realmente me pergunto por que você precisa da variável tipo, e não apenas o tipo de valor?
Para "mas você também receberá subclasses retornando true ..." , acho que você quis dizer "mas você também receberá classes pai retornando true ..." , certo?
Skomisa
3
Use o recurso de sobrecarga do operador do java
classTest{void printType(String x){System.out.print("String");}void printType(int x){System.out.print("Int");}// same goes on with boolean,double,float,object ...}
Object o = "o";
- o tipo da variável é Object, o tipo do valor é String.List<String> l = new ArrayList<String>();
, o tipo da variável éList<String>
, o tipo do valor éArrayList<String>
.Respostas:
fonte
a
é bastante óbvio em tempo de compilaçãoint
valor é em umaint
variável, não há como escrever código que lide com umint
valor e não conheça esse tipo. O problema é diferente caso você esteja lidando com um invólucroInteger
, mas o código desta resposta funcionará novamente.Se você quiser o nome, use o método de Martin. Se você deseja saber se é uma instância de uma determinada classe:
boolean b = a instanceof String
fonte
Double a = 1d; boolean b = a instanceof String;
causará erroerror: incompatible types: Double cannot be converted to String
Gostaria de expandir a resposta de Martin lá ...
Sua solução é bastante boa, mas pode ser alterada para que qualquer "tipo de variável" possa ser impresso dessa maneira (na verdade, é Value Type, mais sobre o tópico ). Dito isto, "tweaked" pode ser uma palavra forte para isso. Independentemente disso, pode ser útil.
Solução Martins:
No entanto, se você deseja que ele funcione com qualquer coisa, você pode fazer isso:
Nesse caso, o primitivo será simplesmente envolvido em um Wrapper. Você obterá o objeto da primitiva nesse caso.
Eu mesmo o usei assim:
Usando genéricos:
fonte
Aprendi com o mecanismo de pesquisa (meu inglês é muito ruim, então código ...) Como obter o tipo de variável? Ups :
este método :
agora exemplo:
fonte
Concordo com o que Joachim Sauer disse, não é possível saber (o tipo de variável! Não o tipo de valor!), A menos que sua variável seja um atributo de classe (e você teria que recuperar os campos da classe, obter o campo correto pelo nome ...)
Na verdade, para mim, é totalmente impossível que qualquer
a.xxx().yyy()
método lhe dê a resposta certa, pois a resposta seria diferente no mesmo objeto, de acordo com o contexto em que você chama esse método ...Como teehoo disse, se você souber compilar uma lista definida de tipos para testar, poderá usar instanceof, mas também obterá subclasses retornando true ...
Uma solução possível seria também se inspirar na implementação
java.lang.reflect.Field
e criar sua própriaField
classe e declarar todas as suas variáveis locais como essaField
implementação personalizada ... mas é melhor você encontrar outra solução, eu realmente me pergunto por que você precisa da variável tipo, e não apenas o tipo de valor?fonte
Use o recurso de sobrecarga do operador do java
fonte
Eu acho que temos várias soluções aqui:
Por quê? Em Java, todas as classes são herdadas da própria classe Object. Então, se você tem uma variável e gostaria de saber seu tipo. Você pode usar
ou
ou
isPrimitive ()
Isso nos dará:
Saiba mais aqui: Como determinar o tipo primitivo de uma variável primitiva?
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
http://docs.oracle.com/cd/E26806_01/wlp.1034/e14255/com/bea/p13n/expression/operator/Instanceof.html
fonte