Lebih
Bagaimana menentukan sebuah objek's class?
Jika kelas B
dan kelas C
memperpanjang kelas A
dan saya memiliki sebuah objek dari tipe B
atau C
, bagaimana saya bisa menentukan dari jenis ini adalah turunan?
487
8
Gunakan Objek.getClass(). Kembali runtime jenis objek.
Beberapa jawaban yang tepat disajikan, tetapi masih ada banyak lagi metode:
Kelas.isAssignableFrom()
dan hanya mencoba untuk melemparkan objek (yang mungkin melemparkanClassCastException
).Mungkin cara yang diringkas
Let's meringkas cara yang mungkin untuk menguji apakah sebuah objek
obj
adalah contoh dari jenisC
:Perbedaan
null
penangananAda perbedaan dalam
null
penanganan meskipun:palsu
jikaobj
adalahnull
(null
adalah bukan contoh dari apa-apa).NullPointerException
jelas.null
karenanull
dapat cor untuk semua jenis!Catatan
Kelas.getName()
tidak boleh digunakan untuk melakukan "adalah contoh-" tes karena jika objek bukan tipeC
, tapi sebuah subclass dari itu, mungkin memiliki nama yang sama sekali berbeda dan paket (oleh karena itu nama kelas akan jelas tidak cocok) tapi itu masih tipeC
.Kelas.isAssignableFrom()
adalah tidak symmetric:obj.getClass().isAssignableFrom(C.class)
akan kembalipalsu
jika jenisobj
adalah sebuah subclass dariC
.Anda dapat menggunakan:
HTH. Tapi saya pikir sebagian besar waktu itu adalah praktik yang baik untuk digunakan untuk mengontrol aliran atau sesuatu yang serupa...
Penggunaan salah satu metode yang disarankan adalah dianggap sebagai kode bau yang berbasis di buruk OO desain.
Jika desain anda baik, anda tidak harus menemukan diri anda perlu untuk menggunakan
getClass()
atauinstanceof
.Salah satu metode yang disarankan akan dilakukan, tetapi hanya sesuatu yang perlu diingat, desain-bijaksana.
Kita dapat menggunakan refleksi dalam hal ini
Contoh:-
Dalam hal ini anda akan mendapatkan nama kelas objek yang lulus untuk
HttpServletRequest
antarmuka pustaka variabel.Ada juga yang
.isInstance
metode "Kelas
" kelas. jika anda mendapatkan sebuah objek's class melaluimyBanana.getClass()
dapat anda lihat jika anda objekmyApple
adalah sebuah instance dari kelas yang sama sebagaimyBanana
viamemeriksa dengan
isinstance()
tidak akan cukup jika anda ingin tahu dalam jangka waktu. gunakan:jika(someObject.getClass().sama dengan(C.class){ // melakukan sesuatu }