Java ist eine statisch typisierte Sprache, daher führt der Compiler den größten Teil dieser Überprüfung für Sie durch. Sobald Sie eine Variable als einen bestimmten Typ deklarieren, stellt der Compiler sicher, dass ihr immer nur Werte dieses Typs zugewiesen werden (oder Werte, die Untertypen dieses Typs sind).
Die Beispiele, die Sie angegeben haben ( int, Array, double), sind alle Grundelemente, und es gibt keine Untertypen davon. Wenn Sie also eine Variable als int: deklarieren :
int x;
Sie können sicher sein, dass es immer nur intWerte enthält.
Wenn Sie eine Variable als a deklariert haben List, enthält die Variable möglicherweise Untertypen von List. Beispiele hierfür sind ArrayList, LinkedListusw.
Wenn Sie eine ListVariable hatten und wissen mussten, ob es sich um eine Variable handelt, können Sie ArrayListFolgendes tun:
List y;...if(y instanceofArrayList){...its and ArrayList...}
Wenn Sie jedoch der Meinung sind, dass Sie dies tun müssen, sollten Sie Ihren Ansatz überdenken. In den meisten Fällen müssen Sie dies nicht tun, wenn Sie objektorientierten Prinzipien folgen. Es gibt natürlich Ausnahmen zu jeder Regel.
Der Operator instanceof bestimmt nur den Datentyp des Objekts, auf das die Variable verweist. Der ursprünglich angeforderte Datentyp der tatsächlichen VARIABLE wird nicht ermittelt.
GrantRobertson
38
Eigentlich ganz einfach, einen eigenen Tester zu rollen, indem man die Fähigkeit von Java zur Methodenüberladung missbraucht. Obwohl ich immer noch neugierig bin, ob es eine offizielle Methode im SDK gibt.
Beispiel:
classTypetester{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");}}
dann:
Typetester t =newTypetester();
t.printType( yourVariable );
Keine gute Methode IMO. Was passiert, wenn ich einen beliebigen Typ übergebe, der in Ihrer Typetester-Klasse nicht definiert ist - in diesem Fall beispielsweise String?
Tash Pemhiwa
6
@TashPemhiwa fügt dann String und Object zu den Auswahlmöglichkeiten hinzu. Kreativität und Problemlösung sind das beste Kapital eines Programmierers.
Kato
8
Dies kann jedoch nur eine feste Menge vordefinierter Klassen behandeln (was den Zweck der Objektorientierung / des Polymorphismus
zunichte macht
3
Die Wahl, welche Signatur zur Kompilierungszeit und nicht zur Laufzeit erfolgt. Diese Technik sagt Ihnen also nichts, was Sie zum Zeitpunkt der Kompilierung noch nicht wissen. docs.oracle.com/javase/specs/jls/se7/html/…
jmh
26
a.getClass().getName()- gibt Ihnen den Datentyp des tatsächlichen Objekts an, auf das verwiesen wird a, jedoch nicht den Datentyp, für den die Variable aursprünglich deklariert oder anschließend umgewandelt wurde.
boolean b = a instanceof String- gibt an, ob das tatsächliche Objekt, auf das verwiesen awird, eine Instanz einer bestimmten Klasse ist. Auch hier hat der Datentyp, für den die Variable aursprünglich deklariert oder anschließend umgewandelt wurde, keinen Einfluss auf das Ergebnis der Instanz des Operators.
Das kann passieren. Ich versuche, Stringein Int in ein Int zu analysieren, und ich würde gerne wissen, ob ich Integer.parseInt(s.substring(a, b))ein Int oder einen Müll rausschmeiße, bevor ich versuche, es zusammenzufassen.
Sie können mit Integer anstelle von int, Double anstelle von double usw. arbeiten (solche Klassen existieren für alle primitiven Typen). Dann können Sie die Operator-Instanz von wie verwendenif(var instanceof Integer){...}
Auf diese Weise müssen Sie nicht mehrere überladene Methoden haben. Ich denke, es ist aufgrund der zusätzlichen Vorteile eine gute Praxis, Sammlungen über Arrays zu verwenden. Trotzdem weiß ich nicht, wie ich nach einem Array-Typ suchen soll. Vielleicht kann jemand diese Lösung verbessern. Hoffe das hilft!
PS Ja, ich weiß, dass dies auch nicht nach Grundelementen sucht.
Der erste Teil Ihrer Frage ist bedeutungslos. Es gibt keinen Umstand, unter dem Sie den Typ einer primitiven Variablen zur Kompilierungszeit nicht kennen.
Zum zweiten Teil ist der einzige Umstand, dass Sie noch nicht wissen, ob eine Variable ein Array ist, wenn es sich um ein Objekt handelt. In welchem Fall object.getClass().isArray()wird es Ihnen sagen.
Ich könnte eine Hashmap von String zu Objekt haben, ein Int in diese Hashmap einfügen und sie wieder herausziehen. Ich weiß nur, dass es sich um ein "Objekt" handelt und möglicherweise prüfen muss, um welchen Typ es sich handelt. Nicht sagen, dass es gut ist, nur sagen, dass es möglich ist.
Matty-D
5
Ich habe es gemacht mit: if(x.getClass() == MyClass.class){...}
Ich war mit keiner dieser Antworten zufrieden, und die richtige hat keine Erklärung und keine negativen Stimmen, also habe ich mich umgesehen, ein paar Sachen gefunden und sie so bearbeitet, dass sie leicht zu verstehen sind. Spielen Sie damit, nicht so einfach, wie man es sich erhoffen würde.
//move your variable into an Object typeObject obj=whatYouAreChecking;System.out.println(obj);// moving the class type into a Class variableClass cls=obj.getClass();System.out.println(cls);// convert that Class Variable to a neat StringString answer = cls.getSimpleName();System.out.println(answer);
Hier ist eine Methode:
publicstaticvoid checkClass (Object obj){Class cls = obj.getClass();System.out.println("The type of the object is: "+ cls.getSimpleName());}
Keine dieser Antworten funktioniert, wenn die Variable ein nicht initialisierter generischer Typ ist
Und soweit ich das beurteilen kann, ist es nur möglich, eine extrem hässliche Problemumgehung zu verwenden oder einen initialisierten Parameter an Ihre Funktion zu übergeben, um sie an Ort und Stelle zu machen. Siehe hier:
<T> T MyMethod(...){if(T.class==MyClass.class){...}}
Ist NICHT gültig, da Sie den Typ nicht Tdirekt aus dem Parameter ziehen können, da er zur Laufzeit gelöscht wird.
Dies funktioniert, weil der Aufrufer dafür verantwortlich ist, die Variable outvor dem Aufruf zu instanziieren . Dies löst immer noch eine Ausnahme aus, wenn out beim Aufruf null ist. Im Vergleich zur verknüpften Lösung ist dies jedoch bei weitem der einfachste Weg, dies zu tun
Ich weiß, dass dies eine Art spezifische Anwendung ist, aber da dies das erste Ergebnis bei Google ist, um den Typ einer Variablen mit Java zu finden (und da dies Teine Art Variable ist), sollte sie meiner Meinung nach enthalten sein
Sie können dies einfach mit Java.lang.Class.getSimpleName()Method Only überprüfen, wenn die Variable einen nicht primitiven Typ hat. Es funktioniert nicht mit primitiven Typen int, long usw.
Ein kleiner Hinweis: Wenn es eine Frage gibt, die 10 Jahre alt ist und> 10 Antworten hat, von denen einige> 100 positive Stimmen haben, dann ist es (nicht unmöglich, aber) sehr , sehr unwahrscheinlich, dass eine neue Antwort etwas Nützliches hinzufügen kann (insbesondere wenn es nur ein Codefragment ist, das sagt "Hier, schau, das druckt etwas" ...)
Antworten:
Java ist eine statisch typisierte Sprache, daher führt der Compiler den größten Teil dieser Überprüfung für Sie durch. Sobald Sie eine Variable als einen bestimmten Typ deklarieren, stellt der Compiler sicher, dass ihr immer nur Werte dieses Typs zugewiesen werden (oder Werte, die Untertypen dieses Typs sind).
Die Beispiele, die Sie angegeben haben (
int
, Array,double
), sind alle Grundelemente, und es gibt keine Untertypen davon. Wenn Sie also eine Variable alsint
: deklarieren :Sie können sicher sein, dass es immer nur
int
Werte enthält.Wenn Sie eine Variable als a deklariert haben
List
, enthält die Variable möglicherweise Untertypen vonList
. Beispiele hierfür sindArrayList
,LinkedList
usw.Wenn Sie eine
List
Variable hatten und wissen mussten, ob es sich um eine Variable handelt, können SieArrayList
Folgendes tun:Wenn Sie jedoch der Meinung sind, dass Sie dies tun müssen, sollten Sie Ihren Ansatz überdenken. In den meisten Fällen müssen Sie dies nicht tun, wenn Sie objektorientierten Prinzipien folgen. Es gibt natürlich Ausnahmen zu jeder Regel.
quelle
Eigentlich ganz einfach, einen eigenen Tester zu rollen, indem man die Fähigkeit von Java zur Methodenüberladung missbraucht. Obwohl ich immer noch neugierig bin, ob es eine offizielle Methode im SDK gibt.
Beispiel:
dann:
quelle
a.getClass().getName()
- gibt Ihnen den Datentyp des tatsächlichen Objekts an, auf das verwiesen wirda
, jedoch nicht den Datentyp, für den die Variablea
ursprünglich deklariert oder anschließend umgewandelt wurde.boolean b = a instanceof String
- gibt an, ob das tatsächliche Objekt, auf das verwiesena
wird, eine Instanz einer bestimmten Klasse ist. Auch hier hat der Datentyp, für den die Variablea
ursprünglich deklariert oder anschließend umgewandelt wurde, keinen Einfluss auf das Ergebnis der Instanz des Operators.Ich habe diese Informationen entnommen aus: Woher kennen Sie einen Variablentyp in Java?
Das kann passieren. Ich versuche,
String
ein Int in ein Int zu analysieren, und ich würde gerne wissen, ob ichInteger.parseInt(s.substring(a, b))
ein Int oder einen Müll rausschmeiße, bevor ich versuche, es zusammenzufassen.Dies ist übrigens als Reflexion bekannt. Hier finden Sie weitere Informationen zu diesem Thema: http://docs.oracle.com/javase/tutorial/reflect/
quelle
Sie können mit Integer anstelle von int, Double anstelle von double usw. arbeiten (solche Klassen existieren für alle primitiven Typen). Dann können Sie die Operator-Instanz von wie verwenden
if(var instanceof Integer){...}
quelle
Benutz einfach:
Beispiel:
Ausgabe:
quelle
randSB
NULL gehalten wird.Ich denke, die Überprüfung des Variablentyps kann auf diese Weise erfolgen.
Auf diese Weise müssen Sie nicht mehrere überladene Methoden haben. Ich denke, es ist aufgrund der zusätzlichen Vorteile eine gute Praxis, Sammlungen über Arrays zu verwenden. Trotzdem weiß ich nicht, wie ich nach einem Array-Typ suchen soll. Vielleicht kann jemand diese Lösung verbessern. Hoffe das hilft!
PS Ja, ich weiß, dass dies auch nicht nach Grundelementen sucht.
quelle
Der erste Teil Ihrer Frage ist bedeutungslos. Es gibt keinen Umstand, unter dem Sie den Typ einer primitiven Variablen zur Kompilierungszeit nicht kennen.
Zum zweiten Teil ist der einzige Umstand, dass Sie noch nicht wissen, ob eine Variable ein Array ist, wenn es sich um ein Objekt handelt. In welchem Fall
object.getClass().isArray()
wird es Ihnen sagen.quelle
Ich habe es gemacht mit:
if(x.getClass() == MyClass.class){...}
quelle
Ich war mit keiner dieser Antworten zufrieden, und die richtige hat keine Erklärung und keine negativen Stimmen, also habe ich mich umgesehen, ein paar Sachen gefunden und sie so bearbeitet, dass sie leicht zu verstehen sind. Spielen Sie damit, nicht so einfach, wie man es sich erhoffen würde.
Hier ist eine Methode:
quelle
Keine dieser Antworten funktioniert, wenn die Variable ein nicht initialisierter generischer Typ ist
Und soweit ich das beurteilen kann, ist es nur möglich, eine extrem hässliche Problemumgehung zu verwenden oder einen initialisierten Parameter an Ihre Funktion zu übergeben, um sie an Ort und Stelle zu machen. Siehe hier:
Ist NICHT gültig, da Sie den Typ nicht
T
direkt aus dem Parameter ziehen können, da er zur Laufzeit gelöscht wird.Dies funktioniert, weil der Aufrufer dafür verantwortlich ist, die Variable
out
vor dem Aufruf zu instanziieren . Dies löst immer noch eine Ausnahme aus, wenn out beim Aufruf null ist. Im Vergleich zur verknüpften Lösung ist dies jedoch bei weitem der einfachste Weg, dies zu tunIch weiß, dass dies eine Art spezifische Anwendung ist, aber da dies das erste Ergebnis bei Google ist, um den Typ einer Variablen mit Java zu finden (und da dies
T
eine Art Variable ist), sollte sie meiner Meinung nach enthalten seinquelle
Sie können dies einfach mit
Java.lang.Class.getSimpleName()
Method Only überprüfen, wenn die Variable einen nicht primitiven Typ hat. Es funktioniert nicht mit primitiven Typen int, long usw.Referenz - Hier ist der Link zu den Oracle-Dokumenten
quelle
Grundsätzlich zum Beispiel:
quelle
öffentliche Klasse Demo1 {
}}
quelle