Como você conhece um tipo de variável em java?


152

Digamos que eu declaro uma variável:

String a = "test";

E eu quero saber que tipo é, ou seja, a saída deve ser java.lang.StringComo faço isso?


1
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).
quer

Respostas:


269
a.getClass().getName()

16
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:

boolean b = a instanceof String


15
você não é Martin também? :)
seokhoonlee

O outro Martin ... LOL;)
chankruze

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:

((Object) myVar).getClass().getName()
//OR
((Object) myInt).getClass().getSimpleName()

Nesse caso, o primitivo será simplesmente envolvido em um Wrapper. Você obterá o objeto da primitiva nesse caso.

Eu mesmo o usei assim:

private static String nameOf(Object o) {
    return o.getClass().getSimpleName();
}

Usando genéricos:

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}

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

3

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

class Test {

    void printType(String x) {
        System.out.print("String");
    }

    void printType(int x) {     
        System.out.print("Int");
    }

    // same goes on with boolean,double,float,object ...

}

8
Java não tem o conceito de sobrecarga de operadores, esta é a sobrecarga de método
nicoschl

2

Eu acho que temos várias soluções aqui:

  • instância de poderia ser uma solução.

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

  • System.out.println (((Object) f) .getClass (). GetName ());

ou

  • Integer.class.isInstance (1985); // dá true

ou

  • isPrimitive ()

    public static void main(String[] args) {
    
     ClassDemo classOne = new ClassDemo();
     Class classOneClass = classOne();
    
     int i = 5;
     Class iClass = int.class;
    
     // checking for primitive type
     boolean retval1 = classOneClass.isPrimitive();
     System.out.println("classOneClass is primitive type? = " + retval1);
    
     // checking for primitive type?
     boolean retval2 = iClass.isPrimitive();
     System.out.println("iClass is primitive type? = " + retval2);
    }

Isso nos dará:

  1. FALSO
  2. VERDADE

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.