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).
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:
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:
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
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?
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
classTest{void printType(String x){System.out.print("String");}void printType(int x){System.out.print("Int");}// same goes on with boolean,double,float,object ...}
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
Object o = "o";
- der Typ der Variablen ist Object, der Typ des Werts ist String.List<String> l = new ArrayList<String>();
ist der Typ der VariablenList<String>
der Typ des WertsArrayList<String>
.Antworten:
quelle
a
zur Kompilierungszeit ziemlich offensichtlich istint
Wert nur in einerint
Variablen verarbeiten können, gibt es keine Möglichkeit, Code zu schreiben, der einenint
Wert verarbeitet und diesen Typ nicht kennt. Die Sache ist anders, wenn Sie einen Wrapper wie behandelnInteger
, aber dann funktioniert der Code dieser Antwort wieder.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
quelle
Double a = 1d; boolean b = a instanceof String;
verursacht einen Fehlererror: incompatible types: Double cannot be converted to String
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:
Wenn Sie jedoch möchten, dass es mit allem funktioniert, können Sie Folgendes tun:
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:
Generika verwenden:
quelle
Ich habe von der Suchmaschine gelernt (Mein Englisch ist sehr schlecht, also Code ...) Wie bekomme ich den Variablentyp? UPS :
diese Methode :
jetzt Beispiel:
quelle
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.Field
und eine eigeneField
Klasse zu erstellen und dann alle Ihre lokalen Variablen als diese benutzerdefinierteField
Implementierung 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?quelle
Verwenden Sie die Operatorüberladungsfunktion von Java
quelle
Ich denke, wir haben hier mehrere Lösungen:
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
oder
oder
isPrimitive ()
Dies wird uns geben:
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
quelle