2012-03-29 27 views
83

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

तुम क्यों नहीं बस Class पैरामीटर के रूप में प्रयोग करेंगे?

+0

http://en.wikipedia.org/wiki/Wildcard_%28Java%29 – Anycorn

+0

http://stackoverflow.com/q/2024513/1140748 –

उत्तर

67

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

यह हमेशा, उसकी विशिष्ट प्रकार को निर्दिष्ट Class<?> का उपयोग कर आप इस अभ्यास का सम्मान कर रहे हैं के द्वारा एक सामान्य प्रकार का उल्लेख करना एक अच्छी आदत है (आप Class के बारे में पता parametrizable होने के लिए कर रहे हैं), लेकिन आप अपने पैरामीटर सीमित नहीं कर रहे हैं के लिए एक विशिष्ट प्रकार। http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

कक्षा वस्तु और प्रतिबिंब (अपने आप आत्मनिरीक्षण करने के लिए इस्तेमाल जावा भाषा की सुविधा) के बारे में संदर्भ::

जेनेरिक्स और वाइल्डकार्ड के बारे में संदर्भ http://java.sun.com/developer/technicalArticles/ALT/Reflection/

+3

बिना किसी प्रकार के 'क्लास' का उपयोग करके इसे करने का क्या फायदा है? वे एक ही चीज़ का प्रतिनिधित्व करते प्रतीत होते हैं। – ashes999

+0

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

+2

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

5

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

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

इसका मतलब है कि किसी भी प्रकार के किसी भी प्रकार (अज्ञात) के साथ कक्षा है।

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

5

इसका मतलब है कि अपने क्लास संदर्भ किसी भी क्लास वस्तु के संदर्भ को पकड़ कर सकते हैं।

यह मूल रूप से "के रूप में कक्षा" एक ही है, लेकिन आप अन्य लोगों को जो अपने कोड को पढ़ने के लिए है कि आप जेनरिक के बारे में भूल नहीं था दिखा रहे हैं, तो आप सिर्फ एक संदर्भ है कि किसी भी कक्षा वस्तु धारण कर सकते हैं चाहता हूँ।

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

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

+1

बोली कहते हैं, "कक्षा सादा कक्षा से अधिक पसंद किया जाता है" और " कक्षा का लाभ "। ऐसा लगता है कि ब्लॉकक्वाट कोणीय ब्रैकेट से सहमत नहीं है। – MasterF

+0

इसे बचने की जरूरत है। इसे अभी फिक्स्ड करें: पी –

3

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

42

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

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

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

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

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

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

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