2008-11-14 19 views
8

मेरे पास कोड का एक ब्लॉक है जो काम करता है और मैं पूछना चाहता था कि वास्तव में क्या हो रहा है?जावा क्लास टाइप

Class<?> normalFormClass = null; 

--- जोड़ा ---

वाइल्डकार्ड "<?>" बात यह है कि मेरे लिए भ्रामक है। इसका उपयोग क्यों नहीं किया जाएगा (जेनेरिक)?

उत्तर

12

इसका मतलब है कि यह किसी भी प्रकार का वर्ग हो सकता है। ? एक वाइल्डकार्ड है जो सभी प्रकारों, या 'किसी' के सेट को दर्शाता है। तो आप बाद में

Integer normalForm = new Integer(); 
normalFormClass = normalForm.getClass(); 

या

String normalForm = new String(); 
normalFormClass = normalForm.getClass(); 

आप जावा पर जेनरिक की जानकारी नहीं है, तो पढ़ http://java.sun.com/developer/technicalArticles/J2SE/generics/

के रूप में कर सकते हैं क्यों, मुझे लगता है कि यह सख्ती कि व्यक्त करने के लिए हो सकता है आप हर जगह जेनेरिक का उपयोग कर रहे हैं और आपका कोड पुराने जावा संस्करणों के साथ संगत नहीं है, या शायद कुछ ट्रिगर खुश आईडीई को बंद करने के लिए। और हाँ,

Class foo 

और

Class<?> foo 

बराबर हैं।

+0

महान उदाहरण! मैं अभी भी जावा की मूल बातें सीख रहा हूं और हमेशा इन ब्रैकेट के साथ कोड की रेखाओं के बारे में सोच रहा हूं। –

+0

धन्यवाद हाँ ... मुझे जेनेरिक के बारे में पता है लेकिन? वाइल्डकार्ड वह चीज थी जिसे मैं सुनिश्चित करना चाहता था कि मैं पूरी तरह समझ गया हूं। –

+0

सिवाय इसके कि आप इस तरह की एक नई कक्षा नहीं बना सकते हैं;) शायद सामान्य FormClass = obj.getClass(); – erickson

0

मुझे संदेह है कि यह होमवर्क है, क्योंकि मैं कभी भी कक्षा में नहीं रहा हूं जो प्रतिबिंब के बारे में बात करता है।

लेकिन यह एक साधारण शून्य असाइनमेंट है। यह कुछ भी नहीं करता है।

2

कक्षा या कक्षा <?> समान रूप से अच्छी तरह से काम करता है। उत्तरार्द्ध का उपयोग करने का एक कारण यह है कि पहले फॉर्म का उपयोग करते समय विचार या संकलक आपको कुछ चेतावनियों से छुटकारा पड़ेगा।

+0

समझ गया और यह –

4
इसके अलावा

, जेनेरिक वर्जन

Class<?> normalClass = null; 

कच्चे प्रकार संस्करण के लिए काफी बराबर है,

Class normalClass = null; 

मुख्य अंतर यह है कि बाद के जावा के संस्करणों कि नहीं है के साथ संगत हो जाएगा जावा 1.4 की तरह जेनरिक का समर्थन करें।

+0

समझ में आता है और इस प्रकार इसका उपयोग यह स्पष्ट करने के लिए किया जा सकता है कि आप 1.4 संगत कोड नहीं लिख रहे हैं, उदाहरण के लिए। –

+0

धन्यवाद यह बहुत स्पष्ट है –

3

कक्षा < टी > का अर्थ है कि जेडीके 1.5 के बाद, वर्ग परिभाषित वर्ग के प्रकार से उत्पन्न होता है। इस बारे में सोचने का एक तरीका यह है कि कक्षा अपने प्रकार के उदाहरण बनाने के लिए एक कारखाना है।
विशेष रूप से, कक्षा < टी > कक्षा.newInstance() विधि से प्रकार टी के उदाहरण बनाता है।

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

0

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

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

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

कक्षा वस्तु और प्रतिबिंब के बारे में संदर्भ (इस्तेमाल किया जावा भाषा की सुविधा ही आत्मनिरीक्षण के लिए): http://java.sun.com/developer/technicalArticles/ALT/Reflection/

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