Seperti yang telah disebutkan orang lain, Anda tidak dapat mengirimkan variabel kelas ke instanceof
karena variabel kelas mereferensikan instance dari Objek , sedangkan tangan kanan instanceof
harus berupa tipe . Artinya, instanceof
tidak berarti "y adalah turunan dari Objek x", itu berarti "y adalah turunan dari tipe X". Jika Anda tidak tahu perbedaan antara Objek dan tipe, pertimbangkan:
Object o = new Object();
Di sini, tipenya adalah Object
, dan o
merupakan referensi ke instance Objek dengan tipe itu. Jadi:
if(o instanceof Object)
valid tapi
if(o instanceof o)
bukan karena o
di sisi kanan adalah Object, bukan tipe.
Lebih spesifik untuk kasus Anda, instance kelas bukanlah tipe, itu adalah Objek (yang dibuat untuk Anda oleh JVM). Dalam metode Anda, Class
adalah tipe, tetapi clazz
merupakan Objek (yah, referensi ke Objek)
Yang Anda butuhkan adalah cara untuk membandingkan Objek dengan Objek Kelas. Ternyata ini populer jadi ini disediakan untuk Anda sebagai metode Object Kelas: isInstance()
.
Berikut adalah Java Doc untuk isInstance, yang menjelaskan hal ini dengan lebih baik:
public boolean isInstance(Object obj)
Menentukan apakah Objek yang ditentukan kompatibel dengan tugas dengan objek yang diwakili oleh Kelas ini. Metode ini adalah padanan dinamis dari operator instanceof bahasa Java. Metode ini mengembalikan nilai true jika argumen Objek yang ditentukan adalah bukan nol dan dapat dilemparkan ke tipe referensi yang diwakili oleh objek Kelas ini tanpa memunculkan ClassCastException. Ia mengembalikan false jika tidak.
Secara khusus, jika objek Kelas ini mewakili kelas yang dideklarasikan, metode ini mengembalikan nilai true jika argumen Objek yang ditentukan adalah turunan dari kelas yang diwakili (atau salah satu subkelasnya); itu mengembalikan false jika tidak. Jika objek Kelas ini mewakili kelas larik, metode ini mengembalikan nilai true jika argumen Objek yang ditentukan dapat diubah menjadi objek dari kelas larik dengan konversi identitas atau dengan konversi referensi yang melebar; itu mengembalikan false jika tidak. Jika objek Kelas ini mewakili antarmuka, metode ini mengembalikan nilai true jika kelas atau superclass apa pun dari argumen Objek yang ditentukan mengimplementasikan antarmuka ini; itu mengembalikan false jika tidak. Jika objek Kelas ini mewakili tipe primitif, metode ini mengembalikan nilai salah.
Parameter: obj - objek untuk diperiksa
Returns: true jika obj adalah turunan dari kelas ini
Sejak: JDK1.1