clazzकुछ Classऔर objहोने दो Object।
है
clazz.isAssignableFrom(obj.getClass())
हमेशा की तरह
clazz.isInstance(obj)
?
यदि नहीं, तो अंतर क्या हैं?
NullPointerExceptionयदि obj == null।
clazzकुछ Classऔर objहोने दो Object।
है
clazz.isAssignableFrom(obj.getClass())
हमेशा की तरह
clazz.isInstance(obj)
?
यदि नहीं, तो अंतर क्या हैं?
NullPointerExceptionयदि obj == null।
जवाबों:
clazz.isAssignableFrom(Foo.class)जब भी clazzऑब्जेक्ट द्वारा प्रतिनिधित्व किया जाने वाला वर्ग सुपरक्लास या सुपरफर्टफेस होगा, तब सच होगा Foo।
clazz.isInstance(obj)जब भी वस्तु objवर्ग का एक उदाहरण है , सच होगा clazz।
अर्थात्:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
हमेशा इतने लंबे समय के रूप में सच है clazzऔर objnonnull हैं।
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> यह इंटरफेस के लिए भी सही है।
objहै nullतो clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)फेंक देंगे NullPointerExceptionऔर वापस नहीं आएंगे true।
दोनों उत्तर बॉलपार्क में हैं, लेकिन न तो पूर्ण उत्तर है।
MyClass.class.isInstance(obj)एक उदाहरण की जाँच के लिए है। यह सही है जब पैरामीटर obj गैर-अशक्त है और MyClassबिना उठाए बिना डाली जा सकती है ClassCastException। दूसरे शब्दों में, ओब्ज एक उदाहरण MyClassया इसके उपवर्ग हैं।
MyClass.class.isAssignableFrom(Other.class)सच वापस आ जाएगा अगर के MyClassरूप में ही है, या एक सुपरक्लास या की सुपरफर्टफेस Other। Otherएक वर्ग या एक इंटरफ़ेस हो सकता है। यह सच है अगर Otherएक में परिवर्तित किया जा सकता है MyClass।
प्रदर्शित करने के लिए एक छोटा कोड:
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()फेंकता NullPointerExceptionहै, जबकि isInstance()सिर्फ गलत है। यही असली जवाब है।
मुझे लगता है कि उन दोनों के लिए परिणाम हमेशा समान होना चाहिए। अंतर यह है कि आपको उपयोग करने के लिए कक्षा के एक उदाहरण की आवश्यकता है isInstanceलेकिन उपयोग करने के लिए सिर्फ Classऑब्जेक्ट isAssignableFrom।
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।
संक्षिप्तता के लिए, हम इन दो एपीआई को नीचे की तरह समझ सकते हैं:
X.class.isAssignableFrom(Y.class)तो Xऔर Yएक ही वर्ग के हैं, या Xहै Yके सुपर वर्ग या सुपर इंटरफ़ेस, सही होगा, अन्यथा, झूठे लौट आते हैं।
X.class.isInstance(y)कहो yवर्ग का एक उदाहरण है Y, अगर Xऔर Yएक ही वर्ग के हैं, या Xहै Yअन्यथा, झूठे के सुपर वर्ग या सुपर इंटरफेस, सच लौटने के लिए,।