Bagaimana cara memeriksa jenis variabel di Java?


Jawaban:


111

Java adalah bahasa yang diketik secara statis, jadi kompilator melakukan sebagian besar pemeriksaan ini untuk Anda. Setelah Anda mendeklarasikan variabel menjadi tipe tertentu, kompilator akan memastikan bahwa variabel tersebut hanya diberi nilai dari tipe itu (atau nilai yang merupakan sub-tipe dari tipe itu).

Contoh yang Anda berikan ( int, array, double) ini semua adalah primitif, dan tidak ada subtipe dari mereka. Jadi, jika Anda mendeklarasikan sebuah variabel sebagai int:

int x;

Anda bisa yakin itu hanya akan menyimpan intnilai.

Jika Anda mendeklarasikan sebuah variabel menjadi a List, bagaimanapun, mungkin saja variabel tersebut akan menampung sub-tipe dari List. Contoh ini meliputi ArrayList, LinkedList, dll

Jika Anda memang memiliki Listvariabel, dan Anda ingin tahu apakah itu sebuah ArrayList, Anda dapat melakukan hal berikut:

List y;
...
if (y instanceof ArrayList) { 
  ...its and ArrayList...
}

Namun, jika Anda merasa perlu melakukan itu, Anda mungkin ingin memikirkan kembali pendekatan Anda. Dalam kebanyakan kasus, jika Anda mengikuti prinsip berorientasi objek, Anda tidak perlu melakukan ini. Ada, tentu saja, pengecualian untuk setiap aturan.


3
Operator instanceof hanya menentukan tipe data dari objek yang dirujuk oleh variabel. Itu tidak menentukan tipe data dari VARIABEL aktual seperti yang diminta semula.
GrantRobertson

38

Sebenarnya cukup mudah untuk menggulung penguji Anda sendiri, dengan menyalahgunakan metode overload kemampuan Java. Padahal saya masih penasaran apakah ada metode resmi di sdk.

Contoh:

class Typetester {
    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");
    }
}

kemudian:

Typetester t = new Typetester();
t.printType( yourVariable );

21
Bukan metode yang bagus IMO. Apa yang terjadi jika saya meneruskan beberapa jenis arbitrer yang tidak ditentukan di kelas Typetester Anda - dalam contoh ini String, misalnya?
Tash Pemhiwa

6
@TashPemhiwa lalu tambahkan String dan Objek ke pilihan. Kreativitas dan pemecahan masalah adalah aset terbaik programmer.
Kato

8
Tetap saja ini hanya dapat menangani satu set kelas yang telah ditentukan sebelumnya (yang mengalahkan tujuan orientasi objek / polimorfisme) dan hanya akan memberi Anda sesuatu seperti "kelas tidak diketahui" untuk objek dari kelas lain
Algoman

3
Pilihan tanda tangan mana yang terjadi pada waktu kompilasi, bukan waktu proses. Jadi teknik ini tidak akan memberi tahu Anda apa pun yang belum Anda ketahui pada waktu kompilasi. docs.oracle.com/javase/specs/jls/se7/html/…
jmh

26

a.getClass().getName()- akan memberi Anda tipe data dari objek sebenarnya yang dirujuk a, tetapi bukan tipe data yang aawalnya dideklarasikan sebagai variabel atau kemudian ditransmisikan.

boolean b = a instanceof String- akan memberi Anda apakah objek sebenarnya yang dirujuk oleh aadalah turunan dari kelas tertentu atau tidak. Sekali lagi, tipe data di mana variabel aawalnya dideklarasikan sebagai atau kemudian dilemparkan ke tidak ada sangkut pautnya dengan hasil dari operator instance.

Saya mengambil informasi ini dari: Bagaimana Anda mengetahui tipe variabel di java?

Ini bisa terjadi. Saya mencoba untuk mengurai a Stringmenjadi int dan saya ingin tahu apakah saya Integer.parseInt(s.substring(a, b))menendang int atau sampah sebelum saya mencoba menyimpulkannya.

Omong-omong, ini dikenal sebagai Refleksi. Berikut beberapa informasi lebih lanjut tentang subjek: http://docs.oracle.com/javase/tutorial/reflect/


14

Anda dapat bekerja dengan Integer alih-alih int, Double, bukan double, dll. (Kelas seperti itu ada untuk semua tipe primitif). Kemudian Anda dapat menggunakan contoh operator, sepertiif(var instanceof Integer){...}


2
Yang kita butuhkan hanyalah kasus penggunaan yang valid.
Marquis dari Lorne

Kedengarannya seperti pendekatan yang paling efisien.
I.Tyger

13

Gunakan saja:

.getClass().getSimpleName();

Contoh:

StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());

Keluaran:

StringBuilder

1
Saya menyarankan untuk mencatat bahwa ini tidak berfungsi jika randSBmemegang NULL.
Basil Bourque

8

Saya rasa memeriksa jenis variabel bisa dilakukan dengan cara ini.

public <T extends Object> void checkType(T object) {    
    if (object instanceof Integer)
        System.out.println("Integer ");
    else if(object instanceof Double)
        System.out.println("Double ");
    else if(object instanceof Float)
        System.out.println("Float : ");
    else if(object instanceof List)
        System.out.println("List! ");
    else if(object instanceof Set)
        System.out.println("Set! ");
}

Dengan cara ini Anda tidak perlu memiliki beberapa metode kelebihan beban. Saya pikir itu adalah praktik yang baik untuk menggunakan koleksi di atas array karena manfaat tambahannya. Karena itu, saya tidak tahu cara memeriksa tipe array. Mungkin seseorang dapat meningkatkan solusi ini. Semoga ini membantu!

PS Ya, saya tahu bahwa ini juga tidak memeriksa primitif.


6

Bagian pertama dari pertanyaan Anda tidak ada artinya. Tidak ada keadaan di mana Anda tidak mengetahui jenis variabel primitif pada waktu kompilasi.

Kembali ke bagian kedua, satu-satunya keadaan yang belum Anda ketahui apakah variabel adalah array adalah jika itu adalah Objek. Dalam hal ini object.getClass().isArray()akan memberitahu Anda.


5
Saya bisa memiliki hashmap dari string ke objek, meletakkan int di hashmap itu, dan menariknya kembali. Satu-satunya hal yang saya tahu adalah bahwa itu adalah "objek" dan harus memeriksa jenisnya. Tidak mengatakan itu baik, hanya mengatakan itu mungkin.
matty-d


2

Saya tidak senang dengan jawaban-jawaban ini, dan jawaban yang benar tidak memiliki penjelasan dan penilaian negatif jadi saya mencari-cari, menemukan beberapa hal dan mengeditnya agar mudah dipahami. Bermainlah dengannya, tidak sesederhana yang diharapkan.

//move your variable into an Object type
Object obj=whatYouAreChecking;
System.out.println(obj);

// moving the class type into a Class variable
Class cls=obj.getClass();
System.out.println(cls);

// convert that Class Variable to a neat String
String answer = cls.getSimpleName();
System.out.println(answer);

Berikut adalah metodenya:

public static void checkClass (Object obj) {
    Class cls = obj.getClass();
    System.out.println("The type of the object is: " + cls.getSimpleName());       
}

1

Tak satu pun dari jawaban ini berfungsi jika variabel adalah tipe generik yang tidak diinisialisasi

Dan dari apa yang dapat saya temukan, itu hanya mungkin menggunakan solusi yang sangat jelek , atau dengan mengirimkan parameter yang diinisialisasi ke fungsi Anda, membuatnya di tempat, lihat di sini:

<T> T MyMethod(...){ if(T.class == MyClass.class){...}}

TIDAK valid karena Anda tidak dapat menarik tipe keluar dari Tparameter secara langsung, karena dihapus pada waktu runtime.

<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}

Ini berfungsi karena pemanggil bertanggung jawab untuk membuat instance variabel outsebelum memanggil. Ini masih akan memunculkan pengecualian jika out adalah null saat dipanggil, tetapi dibandingkan dengan solusi tertaut, sejauh ini cara termudah untuk melakukan ini

Saya tahu ini adalah jenis aplikasi khusus, tetapi karena ini adalah hasil pertama di google untuk menemukan jenis variabel dengan java (dan mengingat itu Tadalah jenis variabel), saya merasa itu harus dimasukkan


0

Anda dapat memeriksanya dengan mudah menggunakan Java.lang.Class.getSimpleName()Metode Hanya jika variabel memiliki tipe non-primitif. Itu tidak bekerja dengan tipe primitif int, long dll.

referensi - Ini adalah tautan dokumen Oracle


0

Pada dasarnya, Misalnya:

public class Kerem
{
    public static void main(String[] args)
    {
        short x = 10;
        short y = 3;
        Object o = y;
        System.out.println(o.getClass()); // java.lang.Short
    }

}

1
Petunjuk kecil: Jika ada pertanyaan yang berusia 10 tahun dan memiliki> 10 jawaban yang beberapa di antaranya memiliki> 100 suara positif, maka (bukan tidak mungkin tetapi) sangat , sangat tidak mungkin bahwa jawaban baru dapat menambahkan sesuatu yang berguna (terutama, padahal ini hanya cuplikan kode yang mengatakan "Ini, lihat, ini mencetak sesuatu" ...)
Marco13

-4

kelas umum Demo1 {

Object printType(Object o)
{
    return o;
}
 public static void main(String[] args) {

    Demo1 d=new Demo1();
    Object o1=d.printType('C');
    System.out.println(o1.getClass().getSimpleName());

}

}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.