Come controllare il tipo di variabile in Java?


Risposte:


111

Java è un linguaggio tipizzato staticamente, quindi il compilatore esegue la maggior parte di questo controllo per te. Dopo aver dichiarato una variabile di un certo tipo, il compilatore si assicurerà che gli vengano assegnati solo valori di quel tipo (o valori che sono sottotipi di quel tipo).

Gli esempi che hai fornito ( int, array, double) sono tutti primitivi e non ci sono sottotipi di essi. Pertanto, se dichiari una variabile come int:

int x;

Puoi essere certo che manterrà solo intvalori.

Se hai dichiarato una variabile come a List, tuttavia, è possibile che la variabile contenga i sottotipi di List. Esempi di questi includono ArrayList, LinkedListecc

Se avevi una Listvariabile e avevi bisogno di sapere se era una ArrayList, potresti fare quanto segue:

List y;
...
if (y instanceof ArrayList) { 
  ...its and ArrayList...
}

Tuttavia, se ti ritrovi a pensare di doverlo fare, potresti voler ripensare al tuo approccio. Nella maggior parte dei casi, se segui i principi orientati agli oggetti, non sarà necessario farlo. Tuttavia, ci sono ovviamente delle eccezioni a ogni regola.


3
L'operatore instanceof determina solo il tipo di dati dell'oggetto a cui fa riferimento la variabile. Non determina il tipo di dati della VARIABILE effettiva come originariamente richiesto.
GrantRobertson

38

In realtà è abbastanza facile eseguire il test del proprio tester, abusando della capacità di sovraccarico del metodo di Java. Anche se sono ancora curioso di sapere se esiste un metodo ufficiale in sdk.

Esempio:

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

poi:

Typetester t = new Typetester();
t.printType( yourVariable );

21
Non è un buon metodo IMO. Cosa succede se passo un tipo arbitrario che non è definito nella tua classe Typetester, in questa istanza String, per esempio?
Tash Pemhiwa

6
@TashPemhiwa quindi aggiunge String e Object alle scelte. La creatività e la risoluzione dei problemi sono le migliori risorse dei programmatori.
Kato

8
Tuttavia questo può trattare solo con un insieme fisso di classi predefinite (che sconfigge lo scopo dell'orientamento agli oggetti / polimorfismo) e ti darà solo qualcosa come "classe sconosciuta" per oggetti di qualsiasi altra classe
Algoman

3
La scelta di quale firma avviene in fase di compilazione, non in fase di esecuzione. Quindi questa tecnica non ti dirà nulla che non sai già in fase di compilazione. docs.oracle.com/javase/specs/jls/se7/html/…
jmh

26

a.getClass().getName()- ti fornirà il tipo di dati dell'oggetto effettivo a cui fa riferimento a, ma non il tipo di dati con cui la variabile è astata originariamente dichiarata o su cui è stato eseguito successivamente il cast.

boolean b = a instanceof String- ti darà se l'oggetto effettivo a cui afa riferimento è un'istanza di una classe specifica. Di nuovo, il tipo di dati che la variabilea stata originariamente dichiarata o a cui è stato eseguito il cast non ha alcuna relazione con il risultato dell'operatore instanceof.

Ho preso queste informazioni da: Come conosci un tipo di variabile in java?

Può succedere. Sto cercando di analizzare a Stringin un int e mi piacerebbe sapere se il mio Integer.parseInt(s.substring(a, b))sta eliminando un int o garbage prima di provare a riassumerlo.

A proposito, questo è noto come riflessione. Ecco alcune ulteriori informazioni sull'argomento: http://docs.oracle.com/javase/tutorial/reflect/


14

Puoi lavorare con Integer invece di int, Double invece di double, ecc. (Tali classi esistono per tutti i tipi primitivi). Quindi puoi usare l'operatore instanceof, comeif(var instanceof Integer){...}


2
Tutto ciò di cui abbiamo bisogno è un caso d'uso valido.
Marchese di Lorne

Sembra l'approccio più efficiente.
I.Tyger

13

Usa solo:

.getClass().getSimpleName();

Esempio:

StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());

Produzione:

StringBuilder

1
Suggerisco di notare che questo non funziona se randSBcontiene NULL.
Basil Bourque

8

Bene, penso che il controllo del tipo di variabile possa essere fatto in questo modo.

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! ");
}

In questo modo non è necessario disporre di più metodi sovraccaricati. Penso che sia una buona pratica utilizzare le raccolte su array a causa dei vantaggi aggiuntivi. Detto questo, non so come verificare un tipo di array. Forse qualcuno può migliorare questa soluzione. Spero che questo ti aiuti!

PS Sì, lo so che anche questo non controlla le primitive.


6

La prima parte della tua domanda è priva di significato. Non ci sono circostanze in cui non si conosce il tipo di una variabile primitiva in fase di compilazione.

Per la seconda parte, l'unica circostanza in cui non sai già se una variabile è un array è se è un Object. In tal caso te object.getClass().isArray()lo dirò.


5
Potrei avere una hashmap dalla stringa all'oggetto, inserire un int in quella hashmap e tirarla fuori. L'unica cosa che so è che è un "oggetto" e potrebbe essere necessario verificare di che tipo è. Non sto dicendo che va bene, sto solo dicendo che è possibile.
matty-d


2

Non ero soddisfatto di nessuna di queste risposte, e quella giusta non ha spiegazioni e voti negativi, quindi ho cercato in giro, ho trovato alcune cose e le ho modificate in modo che fosse facile da capire. Gioca con esso, non così diretto come si potrebbe sperare.

//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);

Ecco un metodo:

public static void checkClass (Object obj) {
    Class cls = obj.getClass();
    System.out.println("The type of the object is: " + cls.getSimpleName());       
}

1

Nessuna di queste risposte funziona se la variabile è un tipo generico non inizializzato

E da quello che posso trovare, è possibile solo usando una soluzione alternativa estremamente brutta , o passando un parametro inizializzato alla tua funzione, rendendolo sul posto, vedi qui:

<T> T MyMethod(...){ if(T.class == MyClass.class){...}}

NON è valido perché non è possibile estrarre il tipo Tdirettamente dal parametro, poiché viene cancellato in fase di runtime.

<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}

Questo funziona perché il chiamante è responsabile di creare un'istanza della variabile outprima della chiamata. Questo genererà comunque un'eccezione se out è nullo quando viene chiamato, ma rispetto alla soluzione collegata, questo è di gran lunga il modo più semplice per farlo

So che questo è un tipo di applicazione specifica, ma poiché questo è il primo risultato su google per trovare il tipo di una variabile con java (e dato che Tè una sorta di variabile), sento che dovrebbe essere incluso



0

Fondamentalmente, ad esempio:

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
    }

}

1
Un piccolo suggerimento: quando c'è una domanda che ha 10 anni e ha> 10 risposte di cui alcune hanno> 100 voti positivi, allora è (non impossibile ma) molto , molto improbabile che una nuova risposta possa aggiungere qualcosa di utile (in particolare, quando è solo uno snippet di codice che dice "Ecco, guarda, questo stampa qualcosa" ...)
Marco13

-4

public class Demo1 {

Object printType(Object o)
{
    return o;
}
 public static void main(String[] args) {

    Demo1 d=new Demo1();
    Object o1=d.printType('C');
    System.out.println(o1.getClass().getSimpleName());

}

}

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.