Hãy clazzlà một số Classvà objlà một số Object.
Là
clazz.isAssignableFrom(obj.getClass())
luôn luôn giống như
clazz.isInstance(obj)
?
Nếu không, sự khác biệt là gì?
NullPointerExceptionnếu obj == null.
Hãy clazzlà một số Classvà objlà một số Object.
Là
clazz.isAssignableFrom(obj.getClass())
luôn luôn giống như
clazz.isInstance(obj)
?
Nếu không, sự khác biệt là gì?
NullPointerExceptionnếu obj == null.
Câu trả lời:
clazz.isAssignableFrom(Foo.class)sẽ đúng bất cứ khi nào lớp được đại diện bởi clazzđối tượng là siêu lớp hoặc siêu giao diện của Foo.
clazz.isInstance(obj)sẽ đúng bất cứ khi nào đối tượng objlà một thể hiện của lớp clazz.
Đó là:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
luôn luôn đúng cho đến khi clazzvà objkhông còn nguyên vẹn.
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> nó cũng đúng cho các giao diện.
objlà nullsau đó clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)sẽ ném một NullPointerExceptionvà không trở lại true.
Cả hai câu trả lời đều ở trong sân bóng nhưng không phải là một câu trả lời hoàn chỉnh.
MyClass.class.isInstance(obj)là để kiểm tra một ví dụ. Nó trả về true khi tham số obj không phải là null và có thể được truyền tới MyClassmà không tăng a ClassCastException. Nói cách khác, obj là một thể hiện của MyClasshoặc các lớp con của nó.
MyClass.class.isAssignableFrom(Other.class)sẽ trả về true nếu MyClassgiống như, hoặc siêu lớp hoặc siêu giao diện của , Other. Othercó thể là một lớp hoặc một giao diện. Nó trả lời đúng nếu Othercó thể được chuyển đổi thành a MyClass.
Một ít mã để chứng minh:
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)? Tôi bối rối bởi đầu ra :)
isAssignableFrom()ném a NullPointerExceptionnếu đối tượng là null, trong khi isInstance()chỉ trả về false. Đó là câu trả lời thực sự.
Tôi nghĩ rằng kết quả cho hai người đó phải luôn giống nhau. Sự khác biệt là bạn cần một thể hiện của lớp để sử dụng isInstancenhưng chỉ cần Classđối tượng sử dụng isAssignableFrom.
Comparable.class.isAssignableFrom(Byte.class) == truenhưng Byte.class.isInstance(Comparable.class) == false. Nói cách khác, isInstance()không đối xứng cho các giao diện, chỉ dành cho các lớp con.
Byte.class.isInstance(Comparable.class)là sai vì một Classđối tượng không phải là một thể hiện của Byte. So sánh đúng Comparable.class.isAssignableFrom(Byte.class)là Comparable.class.isInstance((byte) 1), đó là sự thật.
Bytebạn sẽ phát hiện ra nó mở rộng Numbervà là một lớp. (byte) 1không tương đương với Byte. Các cựu là một người nguyên thủy. Cái sau là một Class.
byteđến Bytevì kiểu tham số của isInstancelà Object.
Để cho ngắn gọn, chúng ta có thể hiểu hai API này như dưới đây:
X.class.isAssignableFrom(Y.class)Nếu Xvà Ylà cùng một lớp, hoặc Xlà Ysiêu lớp hoặc siêu giao diện, hãy trả về true, ngược lại, false.
X.class.isInstance(y)Say ylà một thể hiện của lớp Y, nếu Xvà Ylà cùng một lớp, hoặc Xlà Ysiêu lớp hoặc siêu giao diện, trả về true, ngược lại, sai.