2010-11-10 42 views
23

पूरी जेनेरिक चीज मुझे एक लूप के लिए फेंक रही है, और अधिक तो आरटीटी।जावा isInstance बनाम उदाहरण ऑपरेटर

विशिष्टता? आह अच्छी तरह से यहाँ सार है:

enum QueryHelper { 
    query1, 
    query2; 
    static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) { 
    if (expectedReturn.isInstance (SomeRelatedClass.class)) 
     return query1; 
    else 
     return query2; 
    } 
} 

और फिर मैं यह इतना की तरह कहेंगे:

... 
QueryHelper helper = QueryHelper.getQueryHelper(SomeRelatedClass.class); 
... 

यह इसलिए है कि मैं वास्तव में लचीलेपन वास्तविक सहायक में क्वेरी वापसी प्रकार प्रदान कर सकते हैं। यह कुछ कास्टिंग और ऑब्जेक्ट सृजन करता है। जो मैं देख रहा हूं वह यह है कि कोई मैच नहीं है, क्या मुझे यह कुछ और तरीके से करना चाहिए? या पूरा विचार सिर्फ बुरा है?

और इसका असली दिल यह है कि मैं class.isInstance और instanceOf ऑपरेटर के बीच अंतर को समझ नहीं पा रहा हूं? क्या मुझे उत्तरार्द्ध का उपयोग करना चाहिए?

उत्तर

29

यह ऐसा इसलिए है कि मैं वास्तव में वास्तविक सहायक में क्वेरी रिटर्न प्रकार को लचीला रूप से असाइन कर सकता हूं।

इस विधि

static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) { 
    if (expectedReturn.isInstance (SomeRelatedClass.class)) 
     return query1; 
    else 
     return query2; 
} 

यह हमेशा QueryHelper का एक उदाहरण वापस आ जाएगी की वापसी प्रकार के बारे में लचीला कुछ भी नहीं है। आप वापसी प्रकार चाहते हैं लचीला होना आप की तरह कुछ के रूप में यह निर्धारित करना होगा:

static <T> T getQueryHelper (Class<T> expectedReturn) { 
} 

अब वापसी प्रकार, लचीला है, क्योंकि यह तर्क के प्रकार पर निर्भर

और होगा इसका असली दिल यह है कि मैं class.isInstance और instanceOf ऑपरेटर के बीच अंतर को समझ नहीं पा रहा हूं?

अंतर instanceof एक प्रकार जांच करके देखें कि संकलन समय पर तय हो गई है करता है कि, उदाहरण के लिए है:

static boolean isInstance(Object myVar) { 
    return (myVar instanceof Foo); 
} 

हमेशा कि myVar की जाँच करेगा फू का एक उदाहरण है, जबकि

static <T> boolean isInstance(Object myVar, Class<T> expectedType) { 
    return expectedType.isInstance(myVar); 
} 

जांच करेगा कि MyVar अपेक्षित टाइप का एक उदाहरण है, लेकिन उम्मीद है कि प्रत्येक बार विधि को

+0

नामक एक अलग प्रकार हो सकता है आपका उपयोग पूर्व isInstance पिछड़ा है के लिए पर्याप्त है। उम्मीद की जाएगी टाइप.इस इंस्टेंस (myVar); – Affe

+0

यह स्पष्ट करने के लिए धन्यवाद कि - मुझे मंदी की आवश्यकता है और सोचें कि जब मैं इस कोड को लिख रहा था। यह तब से आकार में बदल गया है, वास्तव में उपयोगी होने के लिए। एक बार फिर धन्यवाद! – rybit

1

isInstance की अपेक्षित तर्क एक ऐसी वस्तु है जो कक्षा का एक उदाहरण हो सकती है जो आपकी कक्षा वस्तु का प्रतिनिधित्व करती है। आप इसकी तुलना किस प्रकार कर रहे हैं कक्षा का एक उदाहरण है ... java.lang.Class! तो यह मैच नहीं जा रहा है।

जैसे, सच होगा:

Class.class.isInstance(SomeRelatedClass.class); 

भी सच होगा (वास्तु टिप्पणी के बिना वास्तव में आपकी क्वेरी सहायक इस तरह के निर्माण के विवेक पर)

expectedReturn.isInstance(new SomeRelatedClass()); 
3

Class.isInstance() नहीं करता है आपके कोड की तरह काम नहीं करता है। यह परीक्षण करता है कि आप जिस ऑब्जेक्ट को पास करते हैं वह कक्षा का एक उदाहरण है। आप कोड में:

expectedReturn.isInstance(SomeRelatedClass.class) 

जिस वस्तु को आप पास कर रहे हैं वह क्लास ऑब्जेक्ट है। जो सच रिटर्न के बजाय इस कोशिश करें,:

Class.class.isInstance(SomeRelatedClass.class); 

क्या आप शायद के लिए देख रहे Class.isAssignableFrom() है, जैसे:

Object.class.isAssignableFrom(Class.class); 

मतलब आप यह कर सकते हैं:

Class klass = ...; 
Object o = klass; 
संबंधित मुद्दे