2010-04-07 11 views
71

यह कोड संकलित क्यों नहीं करता है?उदाहरण के लिए "कक्षा" चर क्यों पारित नहीं किया जा सकता है?

public boolean isOf(Class clazz, Object obj){ 
     if(obj instanceof clazz){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 

मैं क्यों instanceof करने के लिए एक वर्ग चर पारित नहीं कर सकते हैं?

उत्तर

111

instanceof ऑपरेटर Integer जैसे संदर्भ प्रकारों पर काम करता है, और new Integer(213) जैसी वस्तुओं पर नहीं। आप शायद चाहते हैं की तरह

clazz.isInstance(obj) 

साइड नोट कुछ: अपने कोड अधिक संक्षिप्त यदि आप

public boolean isOf(Class clazz, Object obj){ 
    return clazz.isInstance(obj) 
} 
नहीं

वास्तव में यकीन है कि लिखने के तुम अब और एक विधि की जरूरत है, हालांकि हो जाएगा।

+0

मैं कोड पता पूरी तरह से बेकार है , मैं सिर्फ अपने भ्रम का प्रदर्शन करना चाहता हूं :) – eric2323223

+6

'इंटीजर' ** ** कक्षा एक शाब्दिक नहीं है। 'Integer.class' एक वर्ग शाब्दिक होगा (जेएलएस के § 15.8.2 देखें: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.8.2)। 'Exampleof' ऑपरेटर जेएलएस के निर्दिष्ट § 15.20.2 के रूप में "संदर्भ प्रकार" (उर्फ एक प्रकार का नाम) लेता है: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html# 15.20.2 –

+2

ऑब्जेक्ट की पहले से ही आपूर्ति की जा रही है, इसलिए मैं 'clazz.isInstance (obj)' का उपयोग करूंगा। –

12

instanceof केवल स्पष्ट वर्ग नामों (संकलन समय में बताए गए) के साथ उपयोग किया जा सकता है। आदेश में एक क्रम जांच करने के लिए, आपको क्या करना चाहिए:

clazz.isInstance(obj) 

यह clazz.isAssignableFrom(..) के ऊपर एक छोटे लाभ दिया है, क्योंकि यह मामला obj == null बेहतर से संबंधित है।

3

सबसे पहले, instanceof की आवश्यकता है कि सही पर संकार्य एक वास्तविक श्रेणी (उदाहरण obj instanceof Object या obj instanceof Integer) और नहीं प्रकार Class की एक चर रहा है। दूसरे, आप एक बहुत ही आम नौसिखिया गलती है कि तुम सच नहीं करना चाहिए ... निम्नलिखित पैटर्न बना दिया है:

 
return conditional_expression; 

तुम हमेशा कि पुनर्रचना करने होंगे:

 
if (conditional_expression){ 
    return true; 
} else{ 
    return false; 
} 

ऊपर में पुनर्संशोधित किया जा सकता है , क्योंकि यह एक अनावश्यक अगर ... और कथन को समाप्त करता है। इसी तरह, अभिव्यक्ति return conditional_expression ? true : false; एक ही परिणाम के लिए प्रतिक्रियाशील है।

+2

यह कोई गलती नहीं है। शायद बेकार लेकिन कुल ठीक है। शायद आप निकट भविष्य में लौटने से पहले अतिरिक्त कोड चाहते हैं ... –

2

दूसरों के रूप में उल्लेख किया है, तो आप क्योंकि एक वर्ग वैरिएबल संदर्भ एक वस्तु का एक उदाहरण है, जबकि instanceof के दाहिने हाथ की एक प्रकार होने की instanceof करने के लिए एक वर्ग चर पारित नहीं कर सकते हैं। यही है, instanceof का मतलब यह नहीं है कि "y ऑब्जेक्ट एक्स का एक उदाहरण है", इसका अर्थ है "y टाइप एक्स का एक उदाहरण है"। मामले में आप एक वस्तु और एक प्रकार के बीच अंतर पता नहीं है, पर विचार करें:

Object o = new Object();

यहाँ, प्रकार Object है, और o कि प्रकार के साथ वस्तु के कहने के लिए एक संदर्भ है। इस प्रकार:

if(o instanceof Object)

मान्य है, लेकिन

if(o instanceof o)

क्योंकि o दाहिने हाथ की ओर एक वस्तु, नहीं एक प्रकार है नहीं है।

आपके मामले के लिए अधिक विशिष्ट, एक वर्ग उदाहरण एक प्रकार नहीं है, यह ऑब्जेक्ट (जो आपके लिए जेवीएम द्वारा बनाया गया है) है। आपकी विधि में, Class एक प्रकार है, लेकिन clazz एक ऑब्जेक्ट (अच्छी तरह से, किसी ऑब्जेक्ट का संदर्भ)

आपको किसी ऑब्जेक्ट की क्लास ऑब्जेक्ट की तुलना करने का एक तरीका है। यह पता चला है कि यह लोकप्रिय है इसलिए यह आपको क्लास ऑब्जेक्ट की विधि के रूप में प्रदान किया जाता है: isInstance()

यहाँ isInstance के लिए जावा डॉक्टर, जो यह बताती है यह बेहतर:

public boolean isInstance(Object obj)

निर्धारित करता है कि निर्दिष्ट ऑब्जेक्ट काम-संगत वस्तु इस वर्ग का प्रतिनिधित्व करती है। यह विधि गतिशील जावा भाषा उदाहरण ऑपरेटर के बराबर है। विधि सत्य लौटाता है यदि निर्दिष्ट ऑब्जेक्ट तर्क गैर-शून्य है और के बिना क्लासकास्ट अपवाद को बढ़ाकर इस क्लास ऑब्जेक्ट द्वारा संदर्भित संदर्भ प्रकार में डाला जा सकता है। यह अन्यथा झूठी वापसी करता है।

विशेष रूप से, यदि यह कक्षा वस्तु घोषित कक्षा का प्रतिनिधित्व करती है, तो यह विधि सही होती है यदि निर्दिष्ट ऑब्जेक्ट तर्क का प्रतिनिधित्व वर्ग (या इसके किसी भी उप-वर्ग) का उदाहरण है; यह अन्यथा झूठी देता है। यदि यह क्लास ऑब्जेक्ट एक सरणी वर्ग का प्रतिनिधित्व करता है, तो यह विधि सत्य लौटाती है यदि निर्दिष्ट ऑब्जेक्ट तर्क को पहचान रूपांतरण द्वारा सरणी वर्ग के ऑब्जेक्ट में परिवर्तित किया जा सकता है या संदर्भ रूपांतरण को बढ़ाया जा सकता है; यह अन्यथा झूठी वापसी करता है। यदि यह क्लास ऑब्जेक्ट एक इंटरफ़ेस का प्रतिनिधित्व करता है, तो यह विधि सत्य लौटाती है यदि निर्दिष्ट ऑब्जेक्ट तर्क का वर्ग या कोई सुपरक्लास इस इंटरफ़ेस को लागू करता है; यह अन्यथा झूठा रिटर्न देता है। यदि यह कक्षा वस्तु आदिम प्रकार का प्रतिनिधित्व करती है, तो यह विधि गलत होती है।

पैरामीटर: obj - वस्तु
रिटर्न की जांच करने के: अगर सही है obj इस वर्ग का एक उदाहरण है
के बाद से: JDK1.1

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

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