Woher kennen Sie einen Variablentyp in Java? [duplicate]

Lesezeit: 6 Minuten

Benutzer-Avatar
Miguel Ribeiro

Nehmen wir an, ich deklariere eine Variable:

String a = "test";

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

  • Interessieren Sie sich wirklich für die Typ der Variable? Oder kümmern Sie sich um die Art des Wertes? Weil der Typ der Variablen nicht einfach zu ermitteln ist (tatsächlich ist dies für lokale Variablen überhaupt nicht möglich und erfordert eine Reflektion für Felder).

    – Joachim Sauer

    20. April 2010 um 11:23 Uhr

  • @ Paul: Überlege Object o = "o"; – Der Typ der Variablen ist Objekt, der Typ des Werts ist String.

    – Michael Borgwardt

    20. April 2010 um 12:02 Uhr

  • @ Paul In List<String> l = new ArrayList<String>();der Typ der Variablen ist List<String>der Typ des Werts ist ArrayList<String>.

    – Ben Lings

    20. April 2010 um 12:04 Uhr


  • @Ben Lings Der Variablentyp ist java.util.ArrayList und der Werttyp ist java.util.ArrayList.

    – Ajay Takur

    17. Oktober 2013 um 8:37 Uhr

  • @AjayThakur – es ist der Unterschied zwischen dem Kompilierzeittyp (statisch) und dem Laufzeittyp (dynamisch).

    – Ben Lings

    17. Oktober 2013 um 9:10 Uhr

a.getClass().getName()

  • Das gibt den Typ des Werts an. nicht unbedingt der Typ der Variablen.

    – Joachim Sauer

    20. April 2010 um 11:18 Uhr

  • Ich dachte nur, das war es, wonach das OP seit der Erklärung von wirklich gesucht hat a ist ziemlich offensichtlich zur Kompilierzeit

    – Martin

    20. April 2010 um 11:22 Uhr

  • Das würde funktionieren, wenn die Typen keine Primitiven sind … Wenn der Typ int ist, woher weiß man den Typ?

    – Miguel Ribeiro

    20. April 2010 um 11:32 Uhr

  • @Miguel: da kannst du nur so damit umgehen int Wert ist in einem int Variable gibt es keine Möglichkeit, Code zu schreiben, der a behandelt int Wert und nicht Kenne diesen Typ. Anders verhält es sich, wenn Sie mit einem Wrapper hantieren möchten Integeraber dann funktioniert der Code dieser Antwort wieder.

    – Joachim Sauer

    20. April 2010 um 14:12 Uhr

  • dies gilt nicht für einen primitiven Typ.

    – Medi

    21. August 2015 um 2:17 Uhr

Benutzer-Avatar
Atspulgs

Erweitern Sie Martins Antwort …

Martins Lösung

a.getClass().getName()

Erweiterte Lösung

Wenn Sie möchten, dass es mit irgendetwas funktioniert, können Sie dies tun:

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

Im Falle eines primitiven Typs wird er in eine entsprechende Objektvariante verpackt (Autoboxed).

Beispiel #1 (normal)

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

Beispiel #2 (Generika)

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}

Zusätzliches Lernen

  • Interessant. Ich habe gerade Ihren Code ausprobiert: System.out.println( ( (Object) Integer.parseInt(“12”) ).getClass().getSimpleName() ); und es funktioniert! \Ö/

    – shevy

    25. März 2020 um 23:59 Uhr

  • Vielen Dank, bevor die getSimpleName()versuchte ich zu verwenden (Stack)(variable.getClass().toString().split(".")).pop() und es hat nicht funktioniert, ich habe JavaScript-Logik verwendet und sie in einen Stapel umgewandelt, um das letzte Element nach dem Teilen mit zu platzieren . und es hat nicht funktioniert.

    – 27px

    25. Dezember 2020 um 13:25 Uhr

Benutzer-Avatar
Martin Konecny

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

boolean b = a instanceof String

  • bist du nicht auch Martin? 🙂

    – seokhoonlee

    8. Juni 2018 um 17:00 Uhr

  • Der andere Martin … LOL 😉

    – Schanker

    18. Dezember 2019 um 3:00 Uhr

  • Dieser Code Double a = 1d; boolean b = a instanceof String; wird Fehler verursachen error: incompatible types: Double cannot be converted to String

    – Alex78191

    20. Februar 2020 um 18:48 Uhr

Benutzer-Avatar
Kopieren Einfügen

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

Benutzer-Avatar
epischwas001

Verwenden Sie die Funktion zum Überladen von Operatoren in 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 ...

}

  • Java kennt kein Konzept der Operatorüberladung, dies ist Methodenüberladung

    – Nikoschl

    1. November 2016 um 20:18 Uhr

Benutzer-Avatar
Arrun Josef

Ich denke, wir haben hier mehrere Lösungen:

  • Instanz von könnte eine Lösung sein.

Wieso den? In Java wird jede Klasse von der Objektklasse selbst geerbt. Wenn Sie also eine Variable haben und deren Typ wissen möchten. Sie können verwenden

  • System.out.println(((Object)f).getClass().getName());

oder

  • Integer.class.isInstance(1985); // ergibt wahr

oder

  • istPrimitiv()

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

Das wird uns geben:

  1. FALSCH
  2. STIMMT

Erfahren Sie hier mehr: Wie bestimmt man den primitiven Typ einer primitiven Variablen?

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

  • Java kennt kein Konzept der Operatorüberladung, dies ist Methodenüberladung

    – Nikoschl

    1. November 2016 um 20:18 Uhr

Benutzer-Avatar
Andrii Abramow

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 abrufen …)

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

Wie Teehoo sagte, wenn Sie beim Kompilieren eine definierte Liste von zu testenden Typen kennen, 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 Umsetzung zu inspirieren java.lang.reflect.Field und erstellen Sie Ihre eigenen Field Klasse, und deklarieren Sie dann alle Ihre lokalen Variablen als diese benutzerdefinierte Field Implementierung … aber Sie sollten besser eine andere Lösung finden, ich frage mich wirklich, warum Sie den Variablentyp und nicht nur den Werttyp benötigen?

  • Zum “aber Sie werden auch Unterklassen erhalten, die true zurückgeben …”ich glaube du meintest “aber Sie werden auch Elternklassen erhalten, die wahr zurückgeben …”Rechts?

    – Skomisa

    25. März 2018 um 6:33 Uhr

1352100cookie-checkWoher kennen Sie einen Variablentyp in Java? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy