Bagaimana Anda tahu tipe variabel di java?

152

Katakanlah saya mendeklarasikan variabel:

String a = "test";

Dan saya ingin tahu apa jenisnya, yaitu, output harusnya java.lang.StringBagaimana saya melakukan ini?

Miguel Ribeiro
sumber
1
Apakah Anda benar-benar tertarik pada jenis variabel ? Atau apakah Anda peduli dengan jenis nilainya ? Karena jenis variabel tidak dapat dengan mudah diperoleh (pada kenyataannya itu tidak mungkin sama sekali untuk variabel lokal dan memerlukan refleksi untuk bidang).
Joachim Sauer
8
@ Paul: Pertimbangkan Object o = "o";- jenis variabel adalah Object, jenis nilainya adalah String.
Michael Borgwardt
2
@ Paul In List<String> l = new ArrayList<String>();, tipe variabelnya adalah List<String>, tipe nilainya ArrayList<String>.
Ben Lings
1
@ Ben Lings Jenis variabel adalah java.util.ArrayList dan jenis nilainya adalah java.util.ArrayList.
Ajay Takur
1
@AjayThakur - perbedaan antara tipe waktu kompilasi (statis) dan tipe runtime (dinamis).
Ben Lings

Jawaban:

269
a.getClass().getName()
Martin
sumber
16
Itu akan memberi jenis nilai. belum tentu jenis variabelnya.
Joachim Sauer
7
Saya baru tahu itu yang sebenarnya dicari OP karena deklarasi aitu cukup jelas pada waktu kompilasi
Martin
4
Itu akan bekerja jika tipenya tidak primitif ... Jika tipenya int, bagaimana cara mengetahui tipenya?
Miguel Ribeiro
5
@Miguel: karena satu-satunya cara Anda dapat menangani intnilai adalah dalam intvariabel, tidak ada cara untuk menulis kode yang menangani intnilai dan tidak tahu tipe itu. Masalahnya berbeda jika Anda menangani pembungkus suka Integer, tetapi kemudian kode jawaban ini berfungsi lagi.
Joachim Sauer
1
ini tidak benar untuk tipe primitif.
Mehdi
37

Jika Anda ingin namanya, gunakan metode Martin. Jika Anda ingin tahu apakah ini turunan dari kelas tertentu:

boolean b = a instanceof String

Martin Konecny
sumber
15
bukankah Anda juga Martin? :)
seokhoonlee
Martin yang lain ... LOL;)
chankruze
Kode ini Double a = 1d; boolean b = a instanceof String;akan menyebabkan kesalahanerror: incompatible types: Double cannot be converted to String
Alex78191
35

Saya ingin memperluas jawaban Martin di sana ...

Solusinya agak bagus, tetapi bisa di-tweak sehingga "tipe variabel" apa pun dapat dicetak seperti itu. (Ini sebenarnya Value Type, lebih pada topik ). Yang mengatakan, "tweak" mungkin merupakan kata yang kuat untuk ini. Apapun itu, mungkin bermanfaat.

Solusi Martins:

a.getClass().getName()

Namun, Jika Anda ingin bekerja dengan apa pun, Anda dapat melakukan ini:

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

Dalam hal ini, primitif hanya akan dibungkus dengan Wrapper. Anda akan mendapatkan Objek primitif dalam kasus itu.

Saya sendiri menggunakannya seperti ini:

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

Menggunakan Generik:

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}
Atspulgs
sumber
Menarik. Saya baru saja mencoba kode Anda di: System.out.println (((Object) Integer.parseInt ("12")) .getClass (). GetSimpleName ()); dan itu berhasil! \ o /
shevy
31

Saya belajar dari Mesin Pencari (Bahasa Inggris saya sangat buruk, Jadi kode ...) Bagaimana cara mendapatkan tipe variabel? UPS :

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

metode ini :

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

sekarang contoh:

Object o = 1;
o.getClass().getSimpleName();
value:Integer
Copy_Paste
sumber
3

Saya setuju dengan apa yang dikatakan Joachim Sauer, tidak mungkin diketahui (tipe variabel! Bukan tipe nilai!) Kecuali variabel Anda adalah atribut kelas (dan Anda harus mengambil bidang kelas, dapatkan bidang yang benar dengan nama ...)

Sebenarnya bagi saya itu sama sekali tidak mungkin bahwa a.xxx().yyy()metode apa pun memberi Anda jawaban yang benar karena jawabannya akan berbeda pada objek yang sama persis, sesuai dengan konteks di mana Anda memanggil metode ini ...

Seperti kata teehoo, jika Anda tahu di kompilasi daftar jenis yang akan diuji, Anda dapat menggunakan instanceof tetapi Anda juga akan mendapatkan subkelas yang mengembalikan true ...

Salah satu solusi yang mungkin juga akan menginspirasi diri Anda dari implementasi java.lang.reflect.Fielddan membuat Fieldkelas Anda sendiri , dan kemudian mendeklarasikan semua variabel lokal Anda sebagai Fieldimplementasi kustom ini ... tetapi Anda sebaiknya mencari solusi lain, saya benar-benar bertanya-tanya mengapa Anda memerlukan variabel ketik, dan bukan hanya tipe nilai?

Sebastien Lorber
sumber
Untuk "tetapi Anda juga akan mendapatkan subclass yang mengembalikan nilai true ..." , saya pikir maksud Anda adalah "tetapi Anda juga akan mendapatkan kelas induk yang mengembalikan nilai true ..." , kan?
skomisa
3

Gunakan fitur kelebihan operator dari 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
sumber
8
Java tidak memiliki konsep overloading operator, ini metode overloading
nicoschl
2

Saya pikir kami memiliki beberapa solusi di sini:

  • contoh dari bisa menjadi solusi.

Mengapa? Di Jawa setiap kelas diwarisi dari kelas Object itu sendiri. Jadi jika Anda memiliki variabel dan Anda ingin tahu tipenya. Kamu bisa memakai

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

atau

  • Integer.class.isInstance (1985); // berikan benar

atau

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

Ini akan memberi kita:

  1. SALAH
  2. BENAR

Cari tahu lebih lanjut di sini: Bagaimana menentukan tipe primitif dari variabel primitif?

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
sumber