क्या जावा में उदाहरण (वर्ग <?> C) जैसा कुछ है?


87

मैं जांच करना चाहता हूं कि कोई वस्तु oवर्ग का उदाहरण है Cया उपवर्ग का C

उदाहरण के लिए, यदि pवर्ग की है Pointमैं चाहता हूँ x.instanceOf(Point.class)होने के लिए trueऔर भी x.instanceOf(Object.class)होने के लिए true

मैं चाहता हूं कि यह बॉक्सिंग आदिम प्रकारों के लिए भी काम करे। उदाहरण के लिए, यदि xएक है Integerतो x.instanceOf(Integer.class)होना चाहिए true

क्या वहां ऐसी कोई चीज है? यदि नहीं, तो मैं ऐसी विधि कैसे लागू कर सकता हूं?


बॉक्सिंग क्लासेस को संभालना थोड़ा गड़बड़ है
dfa

जवाबों:


172

Class.isInstance वह करता है जो आप चाहते हैं।

if (Point.class.isInstance(someObj)){
    ...
}

बेशक, आपको इसका उपयोग नहीं करना चाहिए यदि आप instanceofइसके बजाय उपयोग कर सकते हैं , लेकिन प्रतिबिंब परिदृश्यों के लिए यह अक्सर काम में आता है।


6
@ शर्म आ रही है शायद यह धीमी है, लेकिन क्या बुरा है यह समझना मुश्किल है! अगर कुछ करने के लिए एक बहुत ही सरल तरीका है - जैसे if (a instanceof Point)- लेकिन आप इसे और अधिक जटिल तरीके से करते हैं, जो भी कोड को पढ़ता है वह सोचने के लिए बाध्य होता है "ओह, इसके लिए एक कारण होना चाहिए कठिन तरीका", और फिर यह जानने के लिए डॉक्स पर जाएं कि कैसे Class.isInstanceअलग है instanceof। आप अपने सहयोगियों का समय बर्बाद करते हैं।
gustafc

21

मैं जांचना चाहता हूं कि क्या ऑब्जेक्ट ओ क्लास सी का उदाहरण है या सी का एक उपवर्ग। उदाहरण के लिए, यदि p वर्ग बिंदु का है तो मुझे x.instanceOf चाहिए (Point.class)

उम्म क्या? ओ, पी और एक्स क्या हैं?

मैं चाहता हूं कि यह आदिम प्रकारों के लिए भी काम करे। उदाहरण के लिए, यदि x पूर्णांक है तो x.instanceOf (Integer.class) और x.instanceOf (Object.class) भी सत्य होना चाहिए।

नहीं, यह भी संकलन नहीं करना चाहिए। प्रिमिटिव ऑब्जेक्ट नहीं हैं, और आप उन पर विधियों को कॉल नहीं कर सकते।

वैसे भी, तीन चीजें हैं, जिनमें से एक निश्चित रूप से आप जो चाहते हैं वह हासिल कर सकते हैं (वे कुछ हद तक जहां लागू होते हैं, वहां कुछ अलग हैं:

  • instanceofऑपरेटर आप संकलन समय पर कक्षा जानते हैं।
  • Class.isInstance () यदि आप किसी वस्तु के वर्ग की जाँच उस वर्ग के खिलाफ करना चाहते हैं जिसे संकलन समय पर नहीं जाना जाता है।
  • Class.isAssignableFrom () यदि आप दो क्लास ऑब्जेक्ट दिए गए असाइनमेंट की जांच करना चाहते हैं।

9
x instanceof Integer
x instanceof Object

आपको बस सही सिंटैक्स का उपयोग करना होगा

प्राइमिटवे प्रकारों के लिए, आपको इसे पूरी तरह से अलग करना होगा। चूंकि आप उनके लिए तरीके नहीं बना सकते हैं, इसलिए आपको एक ऐसा वर्ग चाहिए जो विधि रखता हो। इसलिए "x.instanceOf (Integer.Class)" के बजाय, आपको "MyClassComparer.instanceOf (x, Integer.Class)" या ऐसा कुछ कॉल करना होगा। इसे आसानी से ओवरलोडिंग विधियों द्वारा लागू किया जा सकता है, लेकिन मैं एक ऐसा मामला देखने में विफल रहता हूं, जब यह कार्यक्षमता बिल्कुल वांछनीय होगी।


4

वास्तव में जावा में एक बूलियन ऑपरेटर होता है जिसे इंस्टाफॉफ़ कहा जाता है, जिसका उपयोग यह निर्धारित करने के लिए किया जा सकता है कि ऑब्जेक्ट क्लास का उदाहरण है, उप-वर्ग का उदाहरण है, या किसी विशेष इंटरफ़ेस को लागू करने वाले क्लास का उदाहरण है।

if(obj instanceof SomeClass) {
    // Do something
}

जावा ट्यूटोरियल में इस ऑपरेटर का एक अच्छा उदाहरण है


1
आप आदिम प्रकारों के साथ
इंस्टाफॉ का

4
उसने वस्तुओं के साथ आदिम प्रकारों को भ्रमित किया। कृपया पढ़ें ... "उदाहरण के लिए, यदि x एक पूर्णांक है तो x.instanceOf (Integer.class) और x.instanceOf (Object.class) भी सत्य होना चाहिए।" आपको शर्म आती है कि आप सभी उत्तरों को वोट करते हैं
विजेता ह्यूगो

जावा ट्यूटोरियल का उपयोग करने का सुझाव सुरक्षित (स्प)। यह भाषा सीखने के लिए एक अच्छा संदर्भ है।
luis.espinal

0

तुम कर सकते हो:

if (foo instanceof classNameYouWantToCheck) 

आप आदिम प्रकारों के साथ
इंस्टाफॉ का

कक्षा सिर्फ यह दिखाने के लिए थी कि उसे कक्षा का नाम लिखना चाहिए। मैं इसे ठीक कर
दूंगा

0

"मैं चाहता हूं कि यह आदिम प्रकारों के लिए भी काम करे। उदाहरण के लिए, यदि x एक पूर्णांक है तो x.instanceOf (Integer.class) और x.instanceOf (Object.class) भी सत्य होना चाहिए।"

क्यों? आदिम प्रकार और संदर्भ प्रकार पूरी तरह से अलग हैं। एक आदिम इंट इंजीर और न ही ऑब्जेक्ट का उपप्रकार नहीं है। एक आदिम मूल्य का प्रकार हमेशा संकलित समय पर सांख्यिकीय रूप से जाना जाता है, इसलिए इसके प्रकार का परीक्षण करने का कोई मतलब नहीं है। ज़रूर, आप एक आदिम मूल्य को बॉक्स कर सकते हैं और फिर उसके प्रकार का परीक्षण कर सकते हैं:

(Integer)5 instanceof Integer

लेकिन इससे क्या फायदा होगा?


-2

मुझे लगता है कि आप कच्ची वस्तुओं और जेनेरिक चीजों के बारे में भ्रमित हैं

obj instanceof Class
obj instanceof Class<?> // this is the one you want

2
आप टाइप इरेज़र के कारण इंस्टोऑफ़ ऑपरेटर के दाहिने हाथ की ओर जेनरिक का उपयोग नहीं कर सकते।
मथायस

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