Mengapa kode ini tidak dapat dikompilasi?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
Mengapa saya tidak bisa meneruskan variabel kelas ke instanceof
?
java
class
instanceof
eric2323223
sumber
sumber
Integer
adalah tidak literal kelas.Integer.class
akan menjadi literal kelas (lihat § 15.8.2 dari JLS: java.sun.com/docs/books/jls/third_edition/html/… ). Theinstanceof
Operator mengambil "ReferenceType" (alias nama jenis) seperti yang ditentukan § 15.20.2 dari JLS: java.sun.com/docs/books/jls/third_edition/html/...clazz.isInstance(obj)
karena objek sudah disediakan.instanceof
hanya dapat digunakan dengan nama kelas eksplisit (dinyatakan pada waktu kompilasi). Untuk melakukan pemeriksaan runtime , Anda harus melakukan:Ini memiliki keuntungan kecil
clazz.isAssignableFrom(..)
karena menangani kasus denganobj == null
lebih baik.sumber
Seperti yang telah disebutkan orang lain, Anda tidak dapat mengirimkan variabel kelas ke
instanceof
karena variabel kelas mereferensikan instance dari Objek , sedangkan tangan kananinstanceof
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
, dano
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, tetapiclazz
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:
sumber
Pertama,
instanceof
mensyaratkan bahwa operan di sebelah kanan adalah kelas aktual (misalnyaobj instanceof Object
atauobj instanceof Integer
) dan bukan variabel tipeClass
. Kedua, Anda telah membuat kesalahan pemula yang cukup umum yang seharusnya tidak Anda lakukan ... pola berikut:Hal di atas dapat direfraktor menjadi:
Anda harus selalu melakukan pemfaktoran ulang itu, karena ini menghilangkan pernyataan if ... else yang berlebihan. Demikian pula, ekspresi tersebut dapat diubah menjadi hasil yang sama.
return conditional_expression ? true : false;
sumber