2012-04-03 28 views
10

मैं दो प्रश्न है, actaully ... सबसे पहले, क्यों नहीं कर सकते मैं क्या यह:सूची <Object> और सूची <?>

List<Object> object = new List<Object>(); 

और दूसरा, मैं एक विधि है कि एक List<?> देता है, मैं कैसे बदल जाते हैं कि List<Object> में, क्या मैं इसे आसानी से डालने में सक्षम हूं?

धन्यवाद!

+0

ठीक है, अगर आप कहते हैं कि 'सूची ' को तत्काल नहीं किया जा सकता है, तो यह तरीका कैसा है? – Chris

+0

यह ध्यान देने योग्य है कि 'Arrays.asList (टी ... ए)' एक 'सूची 'देता है। आप 'सूची' को 'सूची li = Arrays.asList (1, 2, "3") के साथ प्रारंभ कर सकते हैं;' कुछ टाइपिंग को सहेजने के लिए, हालांकि लौटाई गई 'सूची' निश्चित आकार और सरणी द्वारा समर्थित होगी: https: //docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList(T ... –

उत्तर

28

मैं यह क्यों नहीं कर सकते हैं:

List<Object> object = new List<Object>(); 

आप ऐसा नहीं कर सकते क्योंकि List एक इंटरफेस है, और इंटरफेस instantiated नहीं किया जा सकता है। केवल (ठोस) कक्षाएं हो सकती हैं।

List<Object> object = new ArrayList<Object>(); 

मैं एक विधि है कि एक List<?> देता है, कैसे मुझे लगता है कि बारी होगा: List को लागू ठोस वर्ग के उदाहरण में शामिल ArrayList, LinkedList आदि

यहाँ कैसे एक ArrayList का एक उदाहरण बन जाएगा है List<Object>

हमें प्रासंगिक कोड दिखाएं और मैं उत्तर अपडेट कर दूंगा।

+0

विधि जो 'सूची ' लौटाती है वह बाहरी पुस्तकालय से है और मैं नहीं कर सकता कोड। मुझे बस पता है कि यह 'सूची ' वापस करने के लिए उपयोग किया जाता था, और फिर उन्होंने कोड अपडेट किया और अब यह 'सूची ' लौटाता है, अनिवार्य रूप से मेरे सभी कोडिंग को तोड़ देता है। – Chris

+0

उत्तर दूसरे भाग को पर्याप्त रूप से संबोधित नहीं करता है सवाल। उदाहरण के बारे में कैसे? –

4
List<Object> object = new List<Object>(); 

आप ऐसा नहीं कर सकते क्योंकि सूची एक अंतरफलक है और आप किसी भी इंटरफ़ेस का उद्देश्य नहीं बना सकते या दूसरे शब्दों में आप किसी भी इंटरफ़ेस का दृष्टांत नहीं कर सकते। इसके अलावा, आप कक्षा के किसी ऑब्जेक्ट को असाइन कर सकते हैं जो इसकी संदर्भ चर के लिए लागू करता है। उदाहरण के लिए आप यह कर सकते हैं:

list<Object> object = new ArrayList<Object>(); 

यहाँ ArrayList एक वर्ग जो लागू करता सूची, आप किसी भी वर्ग जो सूची लागू करता है का उपयोग कर सकते है।

2

सूची एक इंटरफ़ेस है ताकि आप इसे कम नहीं कर सकें। इसके बजाय इसके किसी भी कार्यान्वयन का उपयोग करें उदा।

List<Object> object = new List<Object>(); 

सूची के बारे में: आप इसे उदाहरण के लिए एक सामान्य परम के रूप में किसी भी वस्तु का उपयोग कर सकते हैं:

List<?> list = new ArrayList<String>(); 

या

List<?> list = new ArrayList<Integer>(); 

List<Object> का उपयोग करते समय इस घोषणा अवैध है क्योंकि यह हो जाएगा मिसमैच टाइप करें।

0

अपने दूसरे सवाल का जवाब करने के लिए, हाँ, यदि आप एक List<Object> या किसी भी प्रकार की एक List<T> रूप List<?> डाल सकता है, क्योंकि ? (वाइल्डकार्ड) पैरामीटर इंगित करता है कि सूची एक किसी भीObject का एक समरूप संग्रह है। हालांकि, type को संकलित करने के बारे में जानने का कोई तरीका नहीं है क्योंकि यह केवल निर्यातित एपीआई का हिस्सा है - जिसका अर्थ है कि आप List<?> में क्या डाला जा रहा है। के लिए एक वस्तु एक सामान्य वर्ग में प्रयोग की जाने वाली यह Object की एक उप-प्रकार होना चाहिए, क्योंकि क्रम में

List<?> wildcardList = methodThatReturnsWildcardList(); 
// generates Unchecked cast compiler warning 
List<Object> objectReference = (List<Object>)wildcardList; 

इस मामले आप चेतावनी को अनदेखा कर सकते हैं:

का तरीका यहां बताया डाली होगा है। आइए दिखाएं कि हम इसे List<Integer> के रूप में डालने की कोशिश कर रहे हैं जब वास्तव में String एस का संग्रह होता है।

// this code will compile safely 
List<?> wildcardList = methodThatReturnsWildcardList(); 
List<Integer> integerReference = (List<Integer>)wildcardList; 

// this line will throw an invalid cast exception for any type other than Integer 
Integer myInteger = integerRefence.get(0); 

याद रखें: जेनेरिक प्रकार रनटाइम पर मिटा दिए जाते हैं। आपको पता नहीं होगा कि संग्रह में क्या है, लेकिन आप इसका तत्व निर्धारित करने के लिए एक तत्व प्राप्त कर सकते हैं और .getClass() पर कॉल कर सकते हैं।

Class objectClass = wildcardList.get(0).getClass(); 
संबंधित मुद्दे