2010-10-22 14 views
80

Come posso verificare che la mia variabile sia int, array, double, ecc ...?Come verificare il tipo di variabile in Java?

Modifica: ad esempio, come posso controllare che una variabile sia una matrice? C'è qualche funzione per fare questo?

+0

Date un'occhiata al [API Reflection] (http://download.oracle.com/javase/tutorial/reflect/). – mschonaker

risposta

8

Si può lavorare con Intero invece di int, Doppio invece di doppio, ecc. (Tali classi esistono per tutti i tipi primitivi). Quindi è possibile utilizzare l'istanza dell'operatore, come if(var instanceof Integer){...}

+2

Tutto ciò di cui abbiamo bisogno è un caso d'uso valido. – EJP

+0

Sembra l'approccio più efficiente. –

76

Java è un linguaggio tipizzato staticamente, quindi il compilatore esegue la maggior parte di questo controllo per conto dell'utente. Una volta dichiarata una variabile come un certo tipo, il compilatore si accerterà che vengano sempre assegnati solo valori di quel tipo (o valori che sono sottotipi di quel tipo).

Gli esempi forniti (int, array, double) sono tutti primitivi e non sono presenti sottotipi. Così, se si dichiara una variabile di essere un int:

int x; 

si può essere sicuri che sarà sempre e solo tenere int valori.

Se una variabile è stata dichiarata come List, è possibile che la variabile contenga i sottotipi di List. Esempi di questi includono ArrayList, LinkedList, ecc

Se si ha avuto una variabile List, e si bisogno di sapere se è stato un ArrayList, si potrebbe fare la seguente:

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

Tuttavia, se si trovandoti a pensare di aver bisogno di farlo, potresti voler ripensare al tuo approccio. Nella maggior parte dei casi, se si seguono i principi orientati agli oggetti, non sarà necessario farlo. Ci sono, naturalmente, eccezioni a ogni regola, però.

+0

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

7

La prima parte della tua domanda non ha senso. Non vi è alcuna circostanza in cui non si conosca il tipo di una variabile primitiva in fase di compilazione.

Re la seconda parte, l'unica circostanza che non si sa già se una variabile è una matrice è se si tratta di un oggetto. In tal caso, lo sarà object.getClass().isArray().

+4

Potrei avere un hashmap da una stringa all'oggetto, inserire un int in quell'hashmap e rimuoverlo. L'unica cosa che so è che è un "oggetto" e potrebbe dover verificare per quale tipo è. Non dire che è buono, solo dicendo che è possibile. –

+0

@ matty-d Naturalmente, ma non è quello che sta chiedendo. – EJP

28

In realtà è abbastanza semplice eseguire il rollover del proprio tester, abusando della capacità di sovraccarico del metodo di Java. Anche se sono ancora curioso di sapere se esiste un metodo ufficiale nel 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); 
+13

Non è un buon metodo IMO. Cosa succede se passo qualche tipo arbitrario che non è definito nella tua classe Typetester - in questo caso String, ad esempio? –

+4

@TashPemhiwa quindi aggiunge String e Object alle opzioni. La creatività e la risoluzione dei problemi sono le risorse migliori per i programmatori. – Kato

+5

Ancora questo può riguardare solo un insieme fisso di classi predefinite (che vanifica lo scopo di orientamento/polimorfismo di oggetti) e ti darà solo qualcosa come "classe sconosciuta" per oggetti di qualsiasi altra classe – Algoman

13

a.getClass().getName() - vi darà il tipo di dati l'oggetto reale a cui si riferisce a, ma non il tipo di dati che la variabile a era originariamente dichiarato come o successivamente castato a.

boolean b = a instanceof String - indica se l'oggetto effettivo a cui si riferisce a è un'istanza di una classe specifica. Anche in questo caso, il tipo di dati che la variabile a è stata originariamente dichiarata o successivamente trasmessa non ha alcuna relazione con il risultato dell'operatore instanceof.

ho preso queste informazioni da: How do you know a variable type in java?

Ciò può accadere. Sto cercando di analizzare un numero String in un file int e vorrei sapere se il mio Integer.parseInt(s.substring(a, b)) stacca un file int o un cestino prima di provare a riassumerlo.

A proposito, questo è noto come Reflection. Ecco qualche informazione in più su questo argomento: http://docs.oracle.com/javase/tutorial/reflect/

5

l'ho fatto usando: if(x.getClass() == MyClass.class){...}

-3

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

} 

}

5

Beh, credo che controllando il tipo di variabile può 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 oltre gli 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!

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

1

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. Avere un gioco con esso, non così semplice 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());  
} 
Problemi correlati