Woher kennen Sie einen Variablentyp in Java?

151

Angenommen, ich deklariere eine Variable:

String a = "test";

Und ich möchte wissen, um welchen Typ es sich handelt, dh die Ausgabe sollte lauten. java.lang.StringWie mache ich das?

Miguel Ribeiro
quelle
1
Interessieren Sie sich wirklich für den Typ der Variablen ? Oder interessiert Sie die Art des Wertes ? Da der Typ der Variablen nicht leicht ermittelt werden kann (tatsächlich ist dies für lokale Variablen überhaupt nicht möglich und erfordert eine Reflexion für Felder).
Joachim Sauer
8
@Paul: Betrachten Sie Object o = "o";- der Typ der Variablen ist Object, der Typ des Werts ist String.
Michael Borgwardt
2
@Paul In List<String> l = new ArrayList<String>();ist der Typ der Variablen List<String>der Typ des Werts ArrayList<String>.
Ben Lings
1
@ Ben Lings Der Variablentyp ist java.util.ArrayList und der Werttyp ist java.util.ArrayList.
Ajay Takur
1
@AjayThakur - Dies ist der Unterschied zwischen dem Typ zur Kompilierung (statisch) und dem Typ zur Laufzeit (dynamisch).
Ben Lings

Antworten:

269
a.getClass().getName()
Martin
quelle
16
Das gibt den Typ des Wertes an. nicht unbedingt der Typ der Variablen.
Joachim Sauer
7
Ich dachte nur, dass das genau das war, wonach das OP wirklich suchte, da die Deklaration von azur Kompilierungszeit ziemlich offensichtlich ist
Martin
4
Das würde funktionieren, wenn die Typen keine Grundelemente sind ... Wenn der Typ int ist, woher soll man den Typ kennen?
Miguel Ribeiro
5
@ Miguel: Da Sie einen intWert nur in einer intVariablen verarbeiten können, gibt es keine Möglichkeit, Code zu schreiben, der einen intWert verarbeitet und diesen Typ nicht kennt. Die Sache ist anders, wenn Sie einen Wrapper wie behandeln Integer, aber dann funktioniert der Code dieser Antwort wieder.
Joachim Sauer
1
Dies gilt nicht für einen primitiven Typ.
Mehdi
37

Wenn Sie den Namen möchten, verwenden Sie Martins Methode. Wenn Sie wissen möchten, ob es sich um eine Instanz einer bestimmten Klasse handelt:

boolean b = a instanceof String

Martin Konecny
quelle
15
Bist du nicht auch Martin? :)
Seokhoonlee
Der andere Martin ... LOL;)
Chankruze
Dieser Code Double a = 1d; boolean b = a instanceof String;verursacht einen Fehlererror: incompatible types: Double cannot be converted to String
Alex78191
35

Ich möchte dort auf Martins Antwort eingehen ...

Seine Lösung ist ziemlich nett, aber sie kann so angepasst werden, dass jeder "Variablentyp" so gedruckt werden kann. (Es ist eigentlich Werttyp, mehr zum Thema ). Das heißt, "optimiert" kann ein starkes Wort dafür sein. Unabhängig davon kann es hilfreich sein.

Martins Lösung:

a.getClass().getName()

Wenn Sie jedoch möchten, dass es mit allem funktioniert, können Sie Folgendes tun:

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

In diesem Fall wird das Grundelement einfach in einen Wrapper eingewickelt. In diesem Fall erhalten Sie das Objekt des Grundelements.

Ich selbst habe es so benutzt:

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

Generika verwenden:

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}
Atspulgs
quelle
Interessant. Ich habe gerade Ihren Code anprobiert: System.out.println (((Object) Integer.parseInt ("12")) .getClass (). GetSimpleName ()); und es funktioniert! \ o /
shevy
31

Ich habe von der Suchmaschine gelernt (Mein Englisch ist sehr schlecht, also Code ...) Wie bekomme ich den Variablentyp? UPS :

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

diese Methode :

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

jetzt Beispiel:

Object o = 1;
o.getClass().getSimpleName();
value:Integer
Kopieren Einfügen
quelle
3

Ich stimme dem zu, was Joachim Sauer gesagt hat, es ist nicht möglich zu wissen (der Variablentyp! Nicht der Werttyp!), Es sei denn, Ihre Variable ist ein Klassenattribut (und Sie müssten Klassenfelder abrufen, das richtige Feld nach Namen ermitteln ...).

Eigentlich ist es für mich völlig unmöglich, dass irgendwelche a.xxx().yyy() Methode Ihnen die richtige Antwort gibt, da die Antwort für genau dasselbe Objekt je nach dem Kontext, in dem Sie diese Methode aufrufen, unterschiedlich wäre ...

Wie teehoo sagte, wenn Sie beim Kompilieren einer definierten Liste von zu testenden Typen wissen, können Sie instanceof verwenden, aber Sie erhalten auch Unterklassen, die true zurückgeben ...

Eine mögliche Lösung wäre auch, sich von der Implementierung zu inspirieren java.lang.reflect.Fieldund eine eigene FieldKlasse zu erstellen und dann alle Ihre lokalen Variablen als diese benutzerdefinierte FieldImplementierung zu deklarieren ... aber Sie sollten besser eine andere Lösung finden, ich frage mich wirklich, warum Sie die Variable benötigen Typ und nicht nur der Werttyp?

Sebastien Lorber
quelle
Für "aber Sie werden auch Unterklassen erhalten, die true zurückgeben ..." , meinten Sie ", aber Sie werden auch Elternklassen erhalten, die true zurückgeben ..." , richtig?
Skomisa
3

Verwenden Sie die Operatorüberladungsfunktion von 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 ...

}
epicwhat001
quelle
8
Java hat nicht das Konzept der Operatorüberladung, dies ist Methodenüberladung
Nicoschl
2

Ich denke, wir haben hier mehrere Lösungen:

  • Beispiel könnte eine Lösung sein.

Warum? In Java wird jede Klasse von der Object-Klasse selbst geerbt. Wenn Sie also eine Variable haben und deren Typ kennen möchten. Sie können verwenden

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

oder

  • Integer.class.isInstance (1985); // gibt true

oder

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

Dies wird uns geben:

  1. FALSCH
  2. WAHR

Hier erfahren Sie mehr: Wie kann der primitive Typ einer primitiven Variablen bestimmt werden?

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

Karoly
quelle