जावा: Class.isInstance बनाम Class.isAssignableFrom


232

clazzकुछ Classऔर objहोने दो Object

है

clazz.isAssignableFrom(obj.getClass())

हमेशा की तरह

clazz.isInstance(obj)

?

यदि नहीं, तो अंतर क्या हैं?


26
अगर obj == अशक्त है, तो दूसरा गलत है, पहला नहीं है। ;)
पीटर लॉरी

21
@PeterLawrey, पहले एक फेंक होगा NullPointerExceptionयदि obj == null
२४:४० पर ryvantage

Hrere से नमूने के साथ कुछ उत्तर मिला: mytechnotes.biz/2012/07/…
परमीश कोरकुटी

4
पाठकों के लिए: आप एक गहरे, काले, काले छेद में प्रवेश करने वाले हैं जहाँ से आप कभी नहीं बचेंगे। अंतर अनंत हैं। जब आप अभी भी कर सकते हैं तब छोड़ दें: stackoverflow.com/q/496928/1599699
एंड्रयू

@ParameshKorrakuti डोमेन नाम बदलकर tshikatshikaaa.blogspot.com/2012/07/…
Jérôme Verstrynge

जवाबों:


222

clazz.isAssignableFrom(Foo.class)जब भी clazzऑब्जेक्ट द्वारा प्रतिनिधित्व किया जाने वाला वर्ग सुपरक्लास या सुपरफर्टफेस होगा, तब सच होगा Foo

clazz.isInstance(obj)जब भी वस्तु objवर्ग का एक उदाहरण है , सच होगा clazz

अर्थात्:

clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)

हमेशा इतने लंबे समय के रूप में सच है clazzऔर objnonnull हैं।


3
यह उस मामले को याद करता है जहां फू एक ही चकाचौंध के समान है - जिस स्थिति में यह सच हो जाता है: नीचे दिए गए शीर्ष-उत्तर वाले उत्तर इसे सही करते हैं
Rhubarb

3
मैं मानता हूँ कि जब क्लोज़ एक फू होता है, तो क्लैज़.आईएसएग्निबल फ़ॉरम (Foo.class) सच होता है। मैंने कहा नहीं तो कहाँ?
ऑकेलमैन

5
@ गिल्ली यह वही नहीं है जो ऑकमैन ने कहा था। कृपया उसका उत्तर पुनः पढ़ें।
पूस

2
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> यह इंटरफेस के लिए भी सही है।
पोस

1
तकनीकीता: यदि objहै nullतो clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)फेंक देंगे NullPointerExceptionऔर वापस नहीं आएंगे true
एंड्रयू मासेरेट

196

दोनों उत्तर बॉलपार्क में हैं, लेकिन न तो पूर्ण उत्तर है।

MyClass.class.isInstance(obj)एक उदाहरण की जाँच के लिए है। यह सही है जब पैरामीटर obj गैर-अशक्त है और MyClassबिना उठाए बिना डाली जा सकती है ClassCastException। दूसरे शब्दों में, ओब्ज एक उदाहरण MyClassया इसके उपवर्ग हैं।

MyClass.class.isAssignableFrom(Other.class)सच वापस आ जाएगा अगर के MyClassरूप में ही है, या एक सुपरक्लास या की सुपरफर्टफेस OtherOtherएक वर्ग या एक इंटरफ़ेस हो सकता है। यह सच है अगर 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
    }
}

10
क्यों आपके उदाहरण में "b isAssignableFrom a:" लेकिन कोड है A.class.isAssignableFrom(B.class)? मैं आउटपुट से उलझन में हूं :)
रोमन ट्रूबा

4
ummm ... आपके सभी उदाहरणों में "instOf" सही iff रिटर्न देता है "isAssignableFrom" सच देता है ... मैं इस तरह से अंतर नहीं देखता हूं।
एंड्रॉयड डेवलपर

2
ध्यान रखें कि मुद्रित किया गया पाठ कोड से मेल नहीं खाता और भ्रमित हो सकता है ... उदाहरण: "System.out.println (" b isAssignableFrom a: "+ A.class.isAssignableFrom (B.class));"
पोलीस्टर

21
@Paul उत्तर, जैसा है, सहायक नहीं है, क्योंकि पाठक यह सोचकर अचंभित रह जाता है कि "किसी वर्ग के उप-वर्ग के उदाहरण और वस्तु के प्रकार को कक्षा में परिवर्तनीय होने के बीच क्या अंतर है?" निश्चित रूप से, आप देख सकते हैं कि आपने पाठक को अपना उत्तर पढ़ने के बाद उतने ही प्रश्नों के साथ छोड़ दिया है, जितना कि इस पृष्ठ पर पहुंचने पर। एक बेहतर जवाब वास्तव में अंतर (या उसके अभाव) की व्याख्या करेगा। यदि कोई अंतर नहीं है, तो उत्तर को सीधे राज्य में होना चाहिए, "कोई व्यावहारिक अंतर नहीं है।"
हांग्जो डबिन्स्की

2
इससे भी महत्वपूर्ण बात, पाठक यह सोचकर रह जाता है कि उनके उद्देश्यों के लिए क्या उपयोग करना चाहिए। प्रश्न में टिप्पणियों के अनुसार, यदि कोई वस्तु अशक्त है, तो isAssignableFrom()फेंकता NullPointerExceptionहै, जबकि isInstance()सिर्फ गलत है। यही असली जवाब है।
एंड्रयू

6

मुझे लगता है कि उन दोनों के लिए परिणाम हमेशा समान होना चाहिए। अंतर यह है कि आपको उपयोग करने के लिए कक्षा के एक उदाहरण की आवश्यकता है isInstanceलेकिन उपयोग करने के लिए सिर्फ Classऑब्जेक्ट isAssignableFrom


यह 100% सत्य नहीं है। Comparable.class.isAssignableFrom(Byte.class) == trueलेकिन Byte.class.isInstance(Comparable.class) == false। दूसरे शब्दों में isInstance(), केवल उपवर्गों के लिए, इंटरफेस के लिए सममित नहीं है।
गिल्ली

6
@ गिल्ली: आपको यह थोड़ा गलत लगा। Byte.class.isInstance(Comparable.class)गलत है क्योंकि एक Classवस्तु का उदाहरण नहीं है Byte। सही तुलना Comparable.class.isAssignableFrom(Byte.class)है Comparable.class.isInstance((byte) 1), जो सच है।
कॉलिनड

1
मैं असहमत हूं। यदि आप जावेदॉक देखते हैं Byteतो आपको पता चलेगा कि यह Numberएक वर्ग है। (byte) 1के बराबर नहीं है Byte। पूर्व एक आदिम है। उत्तरार्द्ध एक वर्ग है।
गिली

2
@ गिल्ली: ऑटोबॉक्सिंग इसलिए आदिम byteहै Byteक्योंकि पैरामीटर प्रकार isInstanceहै Object
कॉलिनड

2
ठीक है। मेरा मूल बिंदु यह था कि कॉल एक-दूसरे के लिए बिल्कुल सममित नहीं हैं, लेकिन आपके उत्तर को फिर से पढ़ने के बाद आपने कभी भी यह दावा नहीं किया है कि आप सही हैं।
गिली

6

संक्षिप्तता के लिए, हम इन दो एपीआई को नीचे की तरह समझ सकते हैं:

  1. X.class.isAssignableFrom(Y.class)

तो Xऔर Yएक ही वर्ग के हैं, या Xहै Yके सुपर वर्ग या सुपर इंटरफ़ेस, सही होगा, अन्यथा, झूठे लौट आते हैं।

  1. X.class.isInstance(y)

कहो yवर्ग का एक उदाहरण है Y, अगर Xऔर Yएक ही वर्ग के हैं, या Xहै Yअन्यथा, झूठे के सुपर वर्ग या सुपर इंटरफेस, सच लौटने के लिए,।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.