Jika kelas B
dan kelas C
memperluas kelas A
dan saya memiliki objek tipe B
atau C
, bagaimana saya bisa menentukan tipe mana yang merupakan instance?
java
inheritance
pembawa
sumber
sumber
Jawaban:
sumber
if(!(obj instanceof C))
code
Child1 berikut child1 = new Child1 (); Parent1 parentChild = new Child2 (); Child2 child2 = new Child2 (); (child1 instance dari Parent1); (child1 instanceof Child1); (instance parentChild Child2); (instance parentChild dari Parent1); (instance parentChild Child1);code
, itu dapat menghapus maksud instanceof.Gunakan Object.getClass () . Ini mengembalikan tipe objek runtime.
sumber
Beberapa jawaban benar disajikan, tetapi masih ada lebih banyak metode:
Class.isAssignableFrom()
dan hanya berusaha untuk melemparkan objek (yang mungkin melempar aClassCastException
).Cara yang mungkin dirangkum
Mari merangkum cara-cara yang mungkin untuk menguji apakah suatu objek
obj
adalah turunan dari tipeC
:Perbedaan dalam
null
penangananNamun ada perbedaan
null
penanganan:false
jikaobj
ininull
(null
tidak instance dari apa-apa).NullPointerException
jelas.null
karenanull
dapat digunakan untuk semua jenis!Catatan
Class.getName()
tidak boleh digunakan untuk melakukan tes "adalah-contoh-dari" karena objek bukan tipeC
tetapi subkelasnya, ia mungkin memiliki nama dan paket yang sama sekali berbeda (oleh karena itu nama kelas jelas tidak akan cocok) tetapi itu adalah masih bertipeC
.Class.isAssignableFrom()
tidak simetris :obj.getClass().isAssignableFrom(C.class)
akan kembalifalse
jika jenisnyaobj
adalah subkelas dariC
.sumber
Kamu bisa menggunakan:
HTH. Tapi saya pikir sebagian besar waktu itu bukan praktik yang baik untuk menggunakannya untuk aliran kontrol atau sesuatu yang serupa ...
sumber
Setiap penggunaan metode yang disarankan dianggap sebagai bau kode yang didasarkan pada desain OO yang buruk.
Jika desain Anda bagus, Anda seharusnya tidak perlu menggunakan
getClass()
atauinstanceof
.Salah satu metode yang disarankan akan dilakukan, tetapi hanya sesuatu yang perlu diingat, desain-bijaksana.
sumber
Kita dapat menggunakan refleksi dalam kasus ini
Contoh:-
Dalam hal ini Anda akan mendapatkan nama kelas yang objek dilewatkan ke
HttpServletRequest
variabel referensi antarmuka.sumber
obj.getClass()
akan mengembalikan className, awalan dengan kataclass
request.getClass().getName();
mencetak semua paket! bersama dengan nama kelasAda juga
.isInstance
metode di kelas "Class
". jika Anda mendapatkan kelas objek melaluimyBanana.getClass()
Anda dapat melihat apakah objek AndamyApple
adalah instance dari kelas yang sama denganmyBanana
viasumber
mengecek dengan
isinstance()
tidak akan cukup jika Anda ingin tahu di run time. menggunakan:sumber
Saya menggunakan fungsi blow di kelas GeneralUtils saya, periksa semoga bermanfaat
sumber
Saya Menggunakan Java 8 generics untuk mendapatkan instance objek saat runtime daripada harus menggunakan switch case
lulus semua jenis data dan metode ini akan mencetak jenis data yang Anda lewati saat memanggilnya. misalnya
Berikut ini adalah output
sumber