Come conosci un tipo di variabile in Java?


152

Diciamo che dichiaro una variabile:

String a = "test";

E voglio sapere di che tipo è, ovvero, l'output dovrebbe essere java.lang.StringCome posso farlo?


1
Sei davvero interessato al tipo di variabile ? O ti interessa il tipo di valore ? Perché il tipo della variabile non può essere facilmente ottenuto (in realtà non è affatto possibile per le variabili locali e richiede una riflessione per i campi).
Joachim Sauer,

8
@Paul: considera Object o = "o";: il tipo di variabile è Object, il tipo di valore è String.
Michael Borgwardt,

2
@Paul In List<String> l = new ArrayList<String>();, il tipo di variabile è List<String>, il tipo di valore è ArrayList<String>.
Ben Lings,

1
@Ben Lings Il tipo di variabile è java.util.ArrayList e il tipo di valore è java.util.ArrayList.
Ajay Takur,

1
@AjayThakur: è la differenza tra il tipo di compilazione (statico) e il tipo di runtime (dinamico).
Ben Lings,

Risposte:


269
a.getClass().getName()

16
Ciò fornirà il tipo di valore. non necessariamente il tipo di variabile.
Joachim Sauer,

7
Ho appena pensato che fosse quello che l'OP stava davvero cercando, poiché la dichiarazione di aè abbastanza ovvia al momento della compilazione
Martin,

4
Funzionerebbe se i tipi non sono primitivi ... Se il tipo è int, come conoscerlo?
Miguel Ribeiro,

5
@Miguel: poiché l'unico modo in cui puoi gestire un intvalore è in una intvariabile, non c'è modo di scrivere codice che gestisca un intvalore e non conosca quel tipo. La questione è diversa nel caso in cui tu stia gestendo un wrapper come Integer, ma il codice di questa risposta funziona di nuovo.
Joachim Sauer,

1
questo non è vero per un tipo primitivo.
Mehdi,

37

Se vuoi il nome, usa il metodo di Martin. Se vuoi sapere se si tratta di un'istanza di una determinata classe:

boolean b = a instanceof String


15
non sei anche Martin? :)
seokhoonlee l'

L'altro Martin ... LOL;)
chankruze il

Questo codice Double a = 1d; boolean b = a instanceof String;causerà erroreerror: incompatible types: Double cannot be converted to String
Alex78191

35

Vorrei ampliare la risposta di Martin lì ...

La sua soluzione è piuttosto carina, ma può essere ottimizzata in modo che qualsiasi "tipo variabile" possa essere stampato in questo modo (è in realtà Tipo di valore, più sull'argomento ). Detto questo, "ottimizzato" può essere una parola forte per questo. Indipendentemente da ciò, può essere utile.

Soluzione di Martins:

a.getClass().getName()

Tuttavia, se vuoi che funzioni con qualsiasi cosa puoi farlo:

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

In questo caso, il primitivo sarà semplicemente avvolto in un involucro. In questo caso otterrai l'Oggetto della primitiva.

Io stesso l'ho usato così:

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

Utilizzando Generics:

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

Interessante. Ho appena provato il tuo codice su: System.out.println ((((Object) Integer.parseInt ("12")) .getClass (). GetSimpleName ()); e funziona! \ o /
shevy

31

Ho imparato dal motore di ricerca (il mio inglese è pessimo, quindi il codice ...) Come ottenere il tipo di variabile? UPS :

String str = "test";
String type = str.getClass().getName();
value: type = java.lang.String

questo metodo :

str.getClass().getSimpleName();
value:String

ora esempio:

Object o = 1;
o.getClass().getSimpleName();
value:Integer

3

Sono d'accordo con quello che ha detto Joachim Sauer, impossibile da sapere (il tipo di variabile! Non il tipo di valore!) A meno che la tua variabile non sia un attributo di classe (e dovresti recuperare i campi di classe, ottenere il campo giusto per nome ...)

In realtà per me è assolutamente impossibile che qualsiasi a.xxx().yyy()metodo ti dia la risposta giusta poiché la risposta sarebbe diversa sullo stesso identico oggetto, in base al contesto in cui chiami questo metodo ...

Come diceva teehoo, se sai compilare un elenco definito di tipi da testare puoi usare instanceof ma otterrai anche delle sottoclassi che restituiscono true ...

Una possibile soluzione sarebbe anche quella di ispirarti dall'attuazione di java.lang.reflect.Field e creare la tua Fieldclasse, e quindi dichiarare tutte le tue variabili locali come questa Fieldimplementazione personalizzata ... ma faresti meglio a trovare un'altra soluzione, mi chiedo davvero perché hai bisogno della variabile tipo e non solo il tipo di valore?


Per "ma otterrai anche le sottoclassi che ritornano vere ..." , penso che volevi dire "ma otterrai anche che le classi dei genitori ritornino vere ..." , giusto?
skomisa,

3

Utilizzare la funzione di sovraccarico dell'operatore di 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 non ha il concetto di sovraccarico dell'operatore, questo è un metodo di sovraccarico
nicoschl

2

Penso che abbiamo più soluzioni qui:

  • l'istanza di potrebbe essere una soluzione.

Perché? In Java ogni classe viene ereditata dalla classe Object stessa. Quindi se hai una variabile e vorresti conoscerne il tipo. Puoi usare

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

o

  • Integer.class.isInstance (1985); // dà vero

o

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

Questo ci darà:

  1. FALSE
  2. VERO

Scopri di più qui: Come determinare il tipo primitivo di una variabile 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.