2009-06-17 19 views

उत्तर

34

यह सब सामान्य और कच्चे प्रकार के साथ के रूप में ही है। मौजूदा घोषणाओं के आधार पर संकलक कच्चे प्रकार के बजाय सामान्य प्रकार की मांग कर सकता है।

लेकिन: जावा 1.5 के बाद से आपको जहां भी संभव हो जेनेरिक फॉर्म का उपयोग करना चाहिए। Class<?> स्पष्ट रूप से बताता है कि आपका मतलब है "अज्ञात वर्ग", Class<String> स्पष्ट राज्यों का मतलब है कि आपका मतलब String वर्ग है। एक कच्चे Class का अर्थ दोनों हो सकता है।

अंत में यह कंपाइलर में कोई फर्क नहीं पड़ता है, लेकिन यह आपके कोड के इरादे को और अधिक समझने योग्य और रखरखाव करने में एक बड़ा अंतर बनाता है।

+2

आप वर्ग कक्षा जहां भी संभव हो ... –

+26

आप स्पष्टीकरण के बिना नियमों का उपयोग जहां भी संभव से बचना चाहिए बचना चाहिए। –

10

कक्षा javadoc:

प्रकार पैरामीटर: T - वर्ग इस Class वस्तु द्वारा मॉडलिंग के प्रकार। उदाहरण के लिए, String.class का प्रकार Class<String> है। यदि मॉडलिंग का वर्ग अज्ञात है तो Class<?> का उपयोग करें। प्रकार पैरामीटर के बिना Class की

उपयोग प्रकार पैरामीटर के बिना किसी भी सामान्य वर्ग (Map, List, आदि) का उपयोग कर के समान है - या तो यह एक पूर्व 1.5 विरासत उपयोग न होने या यह सिर्फ कोड है कि करता है का एक खंड है अनचेक प्रकार कास्टिंग के बारे में परवाह नहीं है।

2

कक्षा <?> दिखाता है कि आप जानबूझकर जावा 5-स्तर कोड लिख रहे हैं जो आपको पता नहीं है कि आप किस वर्ग से बात कर रहे हैं या नहीं। इसे छोड़कर यह किसी ऐसे व्यक्ति द्वारा लिखित पुराने कोड या कोड जैसा दिखता है जिसने अभी तक जेनेरिक नहीं सीखा है। वहाँ Class और Class<?> के बीच कोई ज्यादा व्यावहारिक अंतर है क्योंकि वे दोनों एक अज्ञात वर्ग निरूपित

Class   // An unknown class (raw type) 
Class<?>  // An unknown class (generic version) 
Class<String> // The String class 

इस विशेष मामले में:

1

"यह किसी ऐसे व्यक्ति द्वारा लिखित पुराना कोड या कोड जैसा दिखता है जिसने अभी तक जेनेरिक नहीं सीखा है।" यह एक सही बयान है। कक्षा (उच्चारण "अज्ञात वर्ग"), यानी, एक वर्ग जिसका प्रकार कुछ भी मेल खाता है। इसे स्पष्ट कारणों से जंगली-कार्ड प्रकार कहा जाता है।

उदाहरण के लिए

:

public void drawAll(List<Shape> shapes) { 
    for (Shape s: shapes) { 
     s.draw(this); 
    } 
} 

प्रकार नियमों का कहना है कि drawAll() केवल वास्तव में Shape की सूची पर कहा जा सकता है: ऐसा नहीं है, उदाहरण के लिए, पर कहा जा सकता है, कहते हैं, एक List<Circle>। यह दुर्भाग्यपूर्ण है, क्योंकि सभी विधि सूची से आकार पढ़ती हैं, इसलिए इसे List<Circle> पर भी बुलाया जा सकता है।

हम जो भी चाहते हैं वह किसी भी प्रकार के आकार की सूची स्वीकार करने के तरीके के लिए है।

public void drawAll (List <? extends Shape> shapes) { 

} 

अधिक पढ़ सकते हैं: http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

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