2012-01-01 22 views
38

संभव डुप्लिकेट:
Java isInstance vs instanceOf operatorकक्षा.इस इंस्टेंस() और उदाहरण के ऑपरेटर का उपयोग कब करें?

Class.isInstance() का उपयोग कब और जब instanceof ऑपरेटर का उपयोग करने के लिए?

जावा असाइनमेंट संगतता की जांच के लिए दो विकल्प प्रदान कर रहा है। किसका उपयोग करना है?

+5

यदि आप एक प्रश्न को डुप्लिकेट के रूप में बंद करने जा रहे हैं, तो कम से कम पहले के प्रश्नों का हवाला देते हैं। – user949300

उत्तर

45

मुझे लगता है कि सरकारी documentation आप (एक काफी अविशिष्ट रास्ते में यद्यपि) इस एक का जवाब देता है:

इस विधि जावा भाषा ऑपरेटर instanceof के गतिशील बराबर है।

मैं इसका मतलब यह मानता हूं कि isInstance() मुख्य रूप से रनटाइम पर टाइप प्रतिबिंब से निपटने वाले कोड में उपयोग के लिए है। विशेष रूप से, मैं कहूंगा कि यह उन मामलों को संभालने के लिए मौजूद है जहां आप पहले से ही कक्षा (एस) के प्रकार (ओं) के बारे में नहीं जानते हैं जिन्हें आप पहले से सदस्यता की जांच करना चाहते हैं (दुर्लभ हालांकि उन मामलों में शायद)।

उदाहरण के लिए, यदि आप इसका इस्तेमाल कर सकते हैं एक विधि है, तो दो मनमाने ढंग से टाइप किया वस्तुओं, असाइनमेंट संगत हैं की तरह देखने के लिए जाँच करता है कि लिखने के लिए:

public boolean areObjectsAssignable(Object left, Object right) { 
    return left.getClass().isInstance(right); 
} 

सामान्य तौर पर, मैं कहना चाहता हूँ कि instanceof का उपयोग कर किया जाना चाहिए जब भी आप उस वर्ग की तरह जानते हैं जिसे आप पहले से जांचना चाहते हैं तो उसे पसंद किया जाता है। उन दुर्लभ मामलों में जहां आप नहीं करते हैं, इसके बजाय isInstance() का उपयोग करें।

+6

जेनिक्स से निपटने के दौरान 'isInstance' विधि के लिए एक और सामान्य उपयोग-केस है। ऐसी कई स्थितियां हैं जहां आपके पास 'कक्षा ' ऑब्जेक्ट है, और यह जांचने का एकमात्र तरीका है कि कोई ऑब्जेक्ट उस वर्ग से संबंधित है, 'isInstance' विधि – Robin

48

instanceof के लिए आपको संकलन समय पर सटीक कक्षा जानने की आवश्यकता है।

if (foo instanceof ThisClassIKnowRightNow) 
    ... 

isInstance कक्षा के लिए रन टाइम पर निर्णय लिया जाता है। (देर से बाध्यकारी) उदा।

if (someObject.getClass().isInstance(foo)) 
    ... 
+9

+1 है: बिंदु पर। जावा 8 स्ट्रीम के साथ, '.filter (ThisClassIKnowRightNow.class :: isInstance) '.filter (o -> o उदाहरण के साथ यह क्लास IKnowRightNow) से थोड़ा अधिक संक्षिप्त है। – antak

संबंधित मुद्दे