จะทดสอบได้อย่างไรว่าคลาส java หนึ่งขยายอีกคลาสที่รันไทม์?


คำตอบ:



84

หากคุณต้องการที่จะรู้หรือไม่ว่าClassขยายอื่นใช้คลาส # isAssignableFrom (Class) สำหรับตัวอย่างของคุณมันจะเป็น:

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

หากคุณสนใจว่าอินสแตนซ์เป็นประเภทใดประเภทหนึ่งหรือไม่ให้ใช้instanceof:

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

โปรดทราบว่าสิ่งเหล่านี้จะส่งคืนtrueหากคลาส / อินสแตนซ์เป็นสมาชิกของลำดับชั้นชนิดและไม่ จำกัด เฉพาะความสัมพันธ์ระดับซุปเปอร์คลาส / คลาสย่อยโดยตรง ตัวอย่างเช่น:

// 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

หากคุณต้องการตรวจสอบความสัมพันธ์ระดับซูเปอร์คลาส / คลาสย่อยโดยตรงทิมได้ให้คำตอบเช่นกัน


2
อันที่จริงมันคือ B.class.isAssignableFrom (A.class) เนื่องจากเขาต้องการทราบว่า A เป็นคลาสย่อยของ B หรือไม่
Meriton

1
ใช่ฉันจะเปลี่ยนสิ่งนั้น โดยปกติตัวอย่างจะเป็นอีกทางหนึ่ง (B ขยาย A)
Rob Hruska

หลอกค่ะ ;-p ขอบคุณมากสำหรับคำตอบโดยละเอียด; แม้ว่าฉันจะยอมรับบุญคุณเนื่องจากเป็น IMO ที่ชัดเจนที่สุด
Armand

42

คุณต้องการทราบว่าb สามารถกำหนดได้จาก a :

b.isAssignableFrom(a);

นอกจากนี้หากคุณต้องการทราบว่าaเป็นคลาสย่อยโดยตรงของb:

a.getSuperclass().equals(b);

ขอบคุณสำหรับคำตอบและขอบคุณที่ใช้aและbจากคำถาม
Armand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.