एक "क्लास" वैरिएबल को क्यों नहीं दिया जा सकता है?


89

यह कोड संकलन क्यों नहीं करता है?

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

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

जवाबों:


131

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

clazz.isInstance(obj)

साइड नोट: यदि आप लिखते हैं तो आपका कोड अधिक संक्षिप्त होगा

public boolean isOf(Class clazz, Object obj){
    return clazz.isInstance(obj)
}

वास्तव में यकीन नहीं है अगर आपको एक विधि की आवश्यकता है, हालांकि।


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

6
Integerहै एक वर्ग शाब्दिक। Integer.classएक वर्ग शाब्दिक होगा (JLS के a 15.8.2 देखें: java.sun.com/docs/books/jls/third_edition/html/… )। instanceof: ऑपरेटर एक "ReferenceType" (एक प्रकार का नाम उर्फ) लेता है निर्दिष्ट के रूप में § JLS की 15.20.2 java.sun.com/docs/books/jls/third_edition/html/...
जोआचिम सौएर

3
मैं clazz.isInstance(obj)तब से उपयोग करूंगा जब तक कि वस्तु की आपूर्ति पहले ही नहीं हो जाती।
डोनल फैलो

13

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

clazz.isInstance(obj)

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


5

जैसा कि दूसरों ने उल्लेख किया है, आप एक वर्ग चर को पास नहीं कर सकते instanceofक्योंकि एक वर्ग चर वस्तु का एक उदाहरण संदर्भित करता है , जबकि दाहिने हाथ का instanceofएक प्रकार होना चाहिए । इसका instanceofमतलब यह नहीं है कि "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)

निर्धारित करता है कि निर्दिष्ट ऑब्जेक्ट असाइनमेंट-संगत है जो इस वर्ग द्वारा दर्शाए गए ऑब्जेक्ट के साथ है। यह विधि जावा लैंग्वेज इंस्टाफॉपर ऑपरेटर का डायनेमिक समकक्ष है। यह विधि सही है यदि निर्दिष्ट ऑब्जेक्ट तर्क गैर-शून्य है और किसी ClassCastException को बढ़ाए बिना इस क्लास ऑब्जेक्ट द्वारा दर्शाए गए संदर्भ प्रकार पर डाला जा सकता है। यह अन्यथा गलत है।

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

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


3

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

अगर ( सशर्त_सक्रियता ) {
    सच लौटना;
} अन्य{
    विवरण झूठा है;
}

उपरोक्त को निम्न में बदला जा सकता है:

वापसी conditional_expression ;

आपको हमेशा उस रिफैक्टरिंग को करना चाहिए, क्योंकि यह एक निरर्थक को समाप्त करता है यदि ... और कथन। इसी तरह, अभिव्यक्ति उसी परिणाम के लिए प्रतिक्रियाशील है।return conditional_expression ? true : false;


2
वह कोई गलती नहीं है। शायद अनाड़ी लेकिन कुल ठीक। हो सकता है कि आप भविष्य के भविष्य में लौटने से पहले अतिरिक्त कोड चाहते हों ...
अविश्वसनीय जन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.