อนุญาตclazzเป็นบางส่วนClassและมีบางobjObject
คือ
clazz.isAssignableFrom(obj.getClass())
เช่นเดียวกับเสมอ
clazz.isInstance(obj)
?
ถ้าไม่แตกต่างกันอย่างไร
NullPointerException obj == null
อนุญาตclazzเป็นบางส่วนClassและมีบางobjObject
คือ
clazz.isAssignableFrom(obj.getClass())
เช่นเดียวกับเสมอ
clazz.isInstance(obj)
?
ถ้าไม่แตกต่างกันอย่างไร
NullPointerException obj == null
คำตอบ:
clazz.isAssignableFrom(Foo.class)จะเป็นจริงเมื่อใดก็ตามที่ชั้นแทนด้วยclazzวัตถุเป็น superclass หรือ superinterface Fooของ
clazz.isInstance(obj)จะเป็นจริงเมื่อใดก็ตามที่วัตถุที่เป็นตัวอย่างของการเรียนobjclazz
นั่นคือ:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
เป็นจริงเสมอตราบclazzและobjมี nonnull
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> มันเป็นเรื่องจริงสำหรับอินเทอร์เฟซ
objเป็นnullแล้วclazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)จะโยนและไม่กลับมาNullPointerException true
คำตอบทั้งสองอยู่ใน ballpark แต่ไม่มีคำตอบที่สมบูรณ์
MyClass.class.isInstance(obj)สำหรับการตรวจสอบอินสแตนซ์ มันกลับเป็นจริงเมื่อ obj พารามิเตอร์ไม่เป็นโมฆะและสามารถโยนไปโดยไม่ต้องยกMyClass ClassCastExceptionกล่าวอีกนัยหนึ่ง obj เป็นตัวอย่างของMyClassคลาสย่อยหรือ
MyClass.class.isAssignableFrom(Other.class)จะกลับมาจริงถ้าMyClassเป็นเช่นเดียวกับหรือ superclass หรือ superinterface Otherของ Otherสามารถเป็นคลาสหรืออินเทอร์เฟซ มันตอบจริงถ้าสามารถแปลงเป็นOtherMyClass
รหัสเล็กน้อยที่จะแสดง:
public class NewMain
{
public static void main(String[] args)
{
NewMain nm = new NewMain();
nm.doit();
}
class A { }
class B extends A { }
public void doit()
{
A myA = new A();
B myB = new B();
A[] aArr = new A[0];
B[] bArr = new B[0];
System.out.println("b instanceof a: " + (myB instanceof A)); // true
System.out.println("b isInstance a: " + A.class.isInstance(myB)); //true
System.out.println("a isInstance b: " + B.class.isInstance(myA)); //false
System.out.println("b isAssignableFrom a: " + A.class.isAssignableFrom(B.class)); //true
System.out.println("a isAssignableFrom b: " + B.class.isAssignableFrom(A.class)); //false
System.out.println("bArr isInstance A: " + A.class.isInstance(bArr)); //false
System.out.println("bArr isInstance aArr: " + aArr.getClass().isInstance(bArr)); //true
System.out.println("bArr isAssignableFrom aArr: " + aArr.getClass().isAssignableFrom(bArr.getClass())); //true
}
}
A.class.isAssignableFrom(B.class)? ฉันสับสนด้วยผลลัพธ์ :)
isAssignableFrom()a NullPointerExceptionถ้าวัตถุนั้นเป็นโมฆะในขณะที่isInstance()แค่คืนค่าเท็จ นั่นคือคำตอบที่แท้จริง
ฉันคิดว่าผลลัพธ์สำหรับทั้งสองนั้นควรจะเหมือนกันเสมอ ความแตกต่างคือที่คุณต้องการตัวอย่างของการเรียนที่จะใช้isInstanceแต่เพียงวัตถุที่จะใช้ClassisAssignableFrom
Comparable.class.isAssignableFrom(Byte.class) == true Byte.class.isInstance(Comparable.class) == falseกล่าวอีกนัยหนึ่งisInstance()ไม่ได้เป็นสมมาตรสำหรับอินเทอร์เฟซสำหรับคลาสย่อยเท่านั้น
Byte.class.isInstance(Comparable.class)เป็นเท็จเพราะวัตถุที่ไม่ได้เป็นตัวอย่างของClass Byteการเปรียบเทียบที่ถูกต้องComparable.class.isAssignableFrom(Byte.class)คือComparable.class.isInstance((byte) 1)ซึ่งเป็นจริง
Byteคุณจะค้นพบมันขยายNumberและเป็นชั้นเรียน จะไม่เทียบเท่ากับ(byte) 1 Byteอดีตเป็นแบบดั้งเดิม หลังคือคลาส
byteไปByteเพราะพารามิเตอร์ชนิดของคือisInstance Object
เพื่อความกระชับเราสามารถเข้าใจ API ทั้งสองนี้ได้ดังนี้:
X.class.isAssignableFrom(Y.class)ถ้าXและYเป็นคลาสเดียวกันหรือXเป็นYซูเปอร์คลาสหรืออินเทอร์เฟซพิเศษให้คืนค่าจริงมิฉะนั้นเป็นเท็จ
X.class.isInstance(y)Say yเป็นตัวอย่างของคลาสYถ้าXและYเป็นคลาสเดียวกันหรือXเป็นYคลาส super หรืออินเตอร์เฟส super ให้คืนค่าจริงมิฉะนั้นจะเป็นเท็จ