Bagaimana cara menguji jika satu kelas java meluas yang lain saat runtime?

Jawaban:

255

Apakah Anda mencari:

Super.class.isAssignableFrom(Sub.class)
meriton
sumber
84

Jika Anda ingin tahu apakah Classmemanjang atau tidak , gunakan Kelas # isAssignableFrom (Kelas) . Sebagai contoh Anda, itu akan menjadi:

if(B.class.isAssignableFrom(A.class)) { ... }

Jika Anda tertarik pada apakah sebuah instance memiliki tipe tertentu atau tidak, gunakan instanceof:

A obj = new A();
if(obj instanceof B) { ... }

Perhatikan bahwa ini akan kembali truejika kelas / instance adalah anggota dari hirarki tipe dan tidak membatasi untuk mengarahkan hubungan superclass / subclass. Sebagai contoh:

// if A.class extends B.class, and B.class extends C.class
C.class.isAssignableFrom(A.class); // evaluates to true
// ...and...
new A() instanceof C; // evaluates to true

Jika Anda ingin memeriksa hubungan superclass / subclass langsung, Tim juga telah memberikan jawaban .

Rob Hruska
sumber
2
Sebenarnya, itu adalah B.class.isAssignableFrom (A.class), karena dia ingin tahu apakah A adalah subclass dari B.
meriton
1
Ah ya, saya akan mengubahnya. Biasanya contoh adalah sebaliknya (B extending A).
Rob Hruska
ditipu ya ;-p Banyak terima kasih atas jawaban terinci; Saya menerima meriton, karena itu adalah IMO paling jelas.
Armand
42

Anda ingin tahu apakah b dapat ditugaskan dari a :

b.isAssignableFrom(a);

Selain itu, jika Anda ingin tahu itu aadalah subkelas langsung dari b:

a.getSuperclass().equals(b);
Tim Stone
sumber
terima kasih atas jawabannya, dan terima kasih telah menggunakan adan bdari pertanyaan
Armand