2012-09-11 9 views
29

Gibt es in Java eine "typeof" -ähnliche Funktion, die den Typ einer primitiven Datentypvariablen (PDT) oder eines Ausdrucks von Operanden-PDTs zurückgibt?Wie kann man den primitiven Typ einer primitiven Variablen bestimmen?

instanceof scheint nur für Klassentypen zu arbeiten.

+1

Suchen Sie nach einer 'Klasse', die' int', 'long' und so weiter repräsentiert? – dasblinkenlight

+3

Sie können keinen primitiven Datentyp haben, ohne dessen Typ zu kennen. Es müsste in eine Art "Nummer" eingereiht werden, damit Sie es nicht wissen. In diesem Fall können Sie "instanceof" verwenden. – Thor84no

+0

@ Thor84no yeah Sie können mit Reflexion – Bohemian

Antwort

50

Versuchen Sie Folgendes:

int i = 20; 
float f = 20.2f; 
System.out.println(((Object)i).getClass().getName()); 
System.out.println(((Object)f).getClass().getName()); 

Es druckt:

java.lang.Integer 
java.lang.Float 

Was instanceof, könnten Sie sein dynamisches Pendant verwenden Class#isInstance:

Integer.class.isInstance(20); // true 
Integer.class.isInstance(20f); // false 
Integer.class.isInstance("s"); // false 
+0

hat noch nicht versucht, aber das ist es was ich suche. Vielen Dank. – ashley

13

Es gibt eine einfache Art und Weise, Das implizite Boxen braucht man nicht, damit man nicht verwirrt wird Tween-Primitive und ihre Wrapper. Sie können isInstance nicht für primitive Typen verwenden - z. Rufen Integer.TYPE.isInstance(5) (Integer.TYPE entspricht int.class) wird zurück false als 5 ist in eine Integer vorher handoboxed.

Der einfachste Weg, um zu bekommen, was Sie wollen (beachten Sie - es ist technisch zur Kompilierzeit für Primitive gemacht, aber es erfordert immer noch die Auswertung des Arguments) ist durch Überladen. Siehe meine ideone paste.

... 

public static Class<Integer> typeof(final int expr) { 
    return Integer.TYPE; 
} 

public static Class<Long> typeof(final long expr) { 
    return Long.TYPE; 
} 

... 

Dies kann wie folgt zum Beispiel verwendet werden:

System.out.println(typeof(500 * 3 - 2)); /* int */ 
System.out.println(typeof(50 % 3L)); /* long */ 

dies auf den Compiler der Fähigkeit beruht, um den Typen des Ausdrucks und holen die richtige Überlast zu bestimmen.