जावा में कक्षा <?> का क्या अर्थ है?


135

मेरा सवाल ऊपर जैसा है। क्षमा करें, यह शायद एक डुप्लिकेट है, लेकिन मैं <?>अंत में एक उदाहरण नहीं ढूंढ सका ।

आप सिर्फ Classपैरामीटर के रूप में उपयोग क्यों नहीं करेंगे?



जवाबों:


109

Classएक पैरामीटर योग्य वर्ग है, इसलिए आप सिंटैक्स का उपयोग कर सकते हैं Class<T>जहां Tएक प्रकार है। लिखकर Class<?>, आप एक ऐसी Classवस्तु घोषित कर रहे हैं जो किसी भी प्रकार की हो सकती है ( ?एक वाइल्डकार्ड है)। Classप्रकार एक प्रकार है कि एक वर्ग के बारे में मेटा-में जानकारी शामिल है।

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

जेनरिक और वाइल्डकार्ड के संदर्भ: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

Classवस्तु और परावर्तन के बारे में संदर्भ (जावा भाषा की विशेषता जो स्वयं को आत्मसात करने के लिए उपयोग की जाती है): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html


7
केवल Classएक प्रकार के बिना इसका उपयोग करने से क्या लाभ है ? वे एक ही चीज का प्रतिनिधित्व करते दिखते हैं।
ashes999

1
मुझे लगा कि जेनेरिक की पूरी बात यह है कि आप क्लास के प्रकार को नहीं जानते हैं। अन्यथा आप पैरामीटर के लिए एक विशेष वर्ग प्रकार का उपयोग करने के लिए एक फ़ंक्शन को परिभाषित करेंगे। यह प्रश्न चिह्न अभी भी समझ में नहीं आता है।
ब्रेन2000

5
कंपाइलर को बताने के अलावा कोई और लाभ नहीं है कि "मुझे पता है कि यह एक सामान्य वर्ग है, लेकिन मैं वास्तविक प्रकार के बारे में नहीं जानता या परवाह नहीं करता, इसलिए मैं एक ठोस प्रकार देने के बजाय मुझे ?वाइल्डकार्ड दे रहा हूं ।" । यदि आप वाइल्डकार्ड नहीं देते हैं, तो संकलक मानता है कि आप या तो प्रकार भूल गए थे या नहीं जानते थे कि वर्ग सामान्य था और आपको इसके बारे में चेतावनी देगा।
कायमैन


बस Classएक तर्क के लिए पारित नहीं किया जा सकता है जो प्रकार है Class<?>, इसलिए Class<?>सभी स्थिति के लिए अधिक सुविधाजनक है।
पेटर्टेक 7

72

यह <?>एक जानवर है। यह अक्सर भ्रम और त्रुटियों की ओर जाता है, क्योंकि, जब आप इसे पहले देखते हैं, तो आप विश्वास करना शुरू करते हैं, किसी भी जावा प्रकार के<?> लिए एक वाइल्डकार्ड है । जो है .. सच नहीं है। है अज्ञात प्रकार , एक मामूली और गंदा अंतर।<?>

जब आप इसका उपयोग करते हैं तो यह कोई समस्या नहीं है Class। दोनों लाइनें काम करती हैं और संकलन करती हैं:

Class anyType = String.class;
Class <?> theUnknownType = String.class;

लेकिन - अगर हम इसे संग्रह के साथ उपयोग करना शुरू करते हैं, तो हम अजीब संकलन त्रुटियों को देखते हैं:

List<?> list = new ArrayList<Object>();  // ArrayList<?> is not allowed
list.add("a String");                    // doesn't compile ...

हमारा List<?>संग्रह नहीं है, जो किसी भी प्रकार की वस्तु के लिए उपयुक्त है। यह केवल एक प्रकार को संग्रहीत कर सकता है: रहस्यवादी "अनकाउन्ट प्रकार"। जो वास्तविक प्रकार नहीं है, निश्चित रूप से।


8

इसका अर्थ है कि आपका क्लास संदर्भ किसी भी क्लास ऑब्जेक्ट के लिए एक संदर्भ रख सकता है।

यह मूल रूप से "क्लास" के समान है, लेकिन आप अन्य लोगों को दिखा रहे हैं जो आपके कोड को पढ़ते हैं जो आप जेनरिक के बारे में नहीं भूलते हैं, आप बस एक संदर्भ चाहते हैं जो किसी भी क्लास ऑब्जेक्ट को पकड़ सकता है।

ब्रूस एकेल, जावा में सोच:

जावा एसई 5 में, क्लास <?> को सादे क्लास से अधिक पसंद किया जाता है, भले ही वे समतुल्य हों और सादे वर्ग, जैसा कि आपने देखा, कंपाइलर चेतावनी का उत्पादन नहीं करता है। कक्षा <> का लाभ यह है कि यह इंगित करता है कि आप दुर्घटना से, या अज्ञानता से गैर-विशिष्ट वर्ग संदर्भ का उपयोग नहीं कर रहे हैं। आपने गैर-विशिष्ट संस्करण चुना।


1
बोली "कक्षा <?> को सादे वर्ग से अधिक पसंद किया जाता है" और "कक्षा का लाभ <>?"। ऐसा लगता है कि ब्लॉकचोट कोणीय कोष्ठक से सहमत नहीं है।
फिलिप

1
इससे बचने की जरूरत है। इसे अभी निर्धारित करें: पी
सामी कुहोमेन

5

यह एक जेनरिक शाब्दिक है। इसका मतलब है कि आप नहीं जानते कि यह Classउदाहरण किस प्रकार के वर्ग का प्रतिनिधित्व कर रहा है, लेकिन आप अभी भी सामान्य संस्करण का उपयोग कर रहे हैं।

  • यदि आप कक्षा को जानते थे, तो आप उपयोग करेंगे Class<Foo>। इस तरह आप एक नया उदाहरण बना सकते हैं, उदाहरण के लिए, बिना कास्टिंग के:Foo foo = clazz.newInstance();
  • यदि आप जेनरिक का उपयोग बिल्कुल नहीं करते हैं, तो आपको कम से कम एक चेतावनी मिलेगी (और जेनरिक का उपयोग नहीं करना आमतौर पर हतोत्साहित करता है क्योंकि इससे साइड-इफेक्ट का पता लग सकता है)

5

जेनरिक में, वाइल्डकार्ड वर्ण द्वारा एक अज्ञात प्रकार का प्रतिनिधित्व किया जाता है "?"। आधिकारिक उदाहरण के लिए यहां पढ़ें ।


3

इसका मतलब है कि एक वर्ग जिसके पास कुछ भी हो (अज्ञात)।

आपको इसे बेहतर समझने के लिए जावा जेनेरिक ट्यूटोरियल पढ़ना चाहिए

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