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).
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:
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:
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
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?
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
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 ...}
Object o = "o";
- jenis variabel adalah Object, jenis nilainya adalah String.List<String> l = new ArrayList<String>();
, tipe variabelnya adalahList<String>
, tipe nilainyaArrayList<String>
.Jawaban:
sumber
a
itu cukup jelas pada waktu kompilasiint
nilai adalah dalamint
variabel, tidak ada cara untuk menulis kode yang menanganiint
nilai dan tidak tahu tipe itu. Masalahnya berbeda jika Anda menangani pembungkus sukaInteger
, tetapi kemudian kode jawaban ini berfungsi lagi.Jika Anda ingin namanya, gunakan metode Martin. Jika Anda ingin tahu apakah ini turunan dari kelas tertentu:
boolean b = a instanceof String
sumber
Double a = 1d; boolean b = a instanceof String;
akan menyebabkan kesalahanerror: incompatible types: Double cannot be converted to String
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:
Namun, Jika Anda ingin bekerja dengan apa pun, Anda dapat melakukan ini:
Dalam hal ini, primitif hanya akan dibungkus dengan Wrapper. Anda akan mendapatkan Objek primitif dalam kasus itu.
Saya sendiri menggunakannya seperti ini:
Menggunakan Generik:
sumber
Saya belajar dari Mesin Pencari (Bahasa Inggris saya sangat buruk, Jadi kode ...) Bagaimana cara mendapatkan tipe variabel? UPS :
metode ini :
sekarang contoh:
sumber
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.Field
dan membuatField
kelas Anda sendiri , dan kemudian mendeklarasikan semua variabel lokal Anda sebagaiField
implementasi kustom ini ... tetapi Anda sebaiknya mencari solusi lain, saya benar-benar bertanya-tanya mengapa Anda memerlukan variabel ketik, dan bukan hanya tipe nilai?sumber
Gunakan fitur kelebihan operator dari java
sumber
Saya pikir kami memiliki beberapa solusi di sini:
Mengapa? Di Jawa setiap kelas diwarisi dari kelas Object itu sendiri. Jadi jika Anda memiliki variabel dan Anda ingin tahu tipenya. Kamu bisa memakai
atau
atau
isPrimitive ()
Ini akan memberi kita:
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
sumber