मेरा सवाल ऊपर जैसा है। क्षमा करें, यह शायद एक डुप्लिकेट है, लेकिन मैं <?>अंत में एक उदाहरण नहीं ढूंढ सका ।
आप सिर्फ Classपैरामीटर के रूप में उपयोग क्यों नहीं करेंगे?
मेरा सवाल ऊपर जैसा है। क्षमा करें, यह शायद एक डुप्लिकेट है, लेकिन मैं <?>अंत में एक उदाहरण नहीं ढूंढ सका ।
आप सिर्फ Classपैरामीटर के रूप में उपयोग क्यों नहीं करेंगे?
जवाबों:
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
Classएक प्रकार के बिना इसका उपयोग करने से क्या लाभ है ? वे एक ही चीज का प्रतिनिधित्व करते दिखते हैं।
?वाइल्डकार्ड दे रहा हूं ।" । यदि आप वाइल्डकार्ड नहीं देते हैं, तो संकलक मानता है कि आप या तो प्रकार भूल गए थे या नहीं जानते थे कि वर्ग सामान्य था और आपको इसके बारे में चेतावनी देगा।
Class<?>
Classएक तर्क के लिए पारित नहीं किया जा सकता है जो प्रकार है Class<?>, इसलिए Class<?>सभी स्थिति के लिए अधिक सुविधाजनक है।
यह <?>एक जानवर है। यह अक्सर भ्रम और त्रुटियों की ओर जाता है, क्योंकि, जब आप इसे पहले देखते हैं, तो आप विश्वास करना शुरू करते हैं, किसी भी जावा प्रकार के<?> लिए एक वाइल्डकार्ड है । जो है .. सच नहीं है। है अज्ञात प्रकार , एक मामूली और गंदा अंतर।<?>
जब आप इसका उपयोग करते हैं तो यह कोई समस्या नहीं है 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<?>संग्रह नहीं है, जो किसी भी प्रकार की वस्तु के लिए उपयुक्त है। यह केवल एक प्रकार को संग्रहीत कर सकता है: रहस्यवादी "अनकाउन्ट प्रकार"। जो वास्तविक प्रकार नहीं है, निश्चित रूप से।
इसका अर्थ है कि आपका क्लास संदर्भ किसी भी क्लास ऑब्जेक्ट के लिए एक संदर्भ रख सकता है।
यह मूल रूप से "क्लास" के समान है, लेकिन आप अन्य लोगों को दिखा रहे हैं जो आपके कोड को पढ़ते हैं जो आप जेनरिक के बारे में नहीं भूलते हैं, आप बस एक संदर्भ चाहते हैं जो किसी भी क्लास ऑब्जेक्ट को पकड़ सकता है।
ब्रूस एकेल, जावा में सोच:
जावा एसई 5 में, क्लास <?> को सादे क्लास से अधिक पसंद किया जाता है, भले ही वे समतुल्य हों और सादे वर्ग, जैसा कि आपने देखा, कंपाइलर चेतावनी का उत्पादन नहीं करता है। कक्षा <> का लाभ यह है कि यह इंगित करता है कि आप दुर्घटना से, या अज्ञानता से गैर-विशिष्ट वर्ग संदर्भ का उपयोग नहीं कर रहे हैं। आपने गैर-विशिष्ट संस्करण चुना।
यह एक जेनरिक शाब्दिक है। इसका मतलब है कि आप नहीं जानते कि यह Classउदाहरण किस प्रकार के वर्ग का प्रतिनिधित्व कर रहा है, लेकिन आप अभी भी सामान्य संस्करण का उपयोग कर रहे हैं।
Class<Foo>। इस तरह आप एक नया उदाहरण बना सकते हैं, उदाहरण के लिए, बिना कास्टिंग के:Foo foo = clazz.newInstance();