2016-02-08 4 views
5

मैंने कुछ विषयों को पढ़ा है जो जेनेरिक के बारे में कुछ प्रश्नों को कवर करते हैं, जैसे उनके relationship with raw types। लेकिन मुझे Java SE tutorial on unbound generics में मिली एक निश्चित रेखा पर एक अतिरिक्त स्पष्टीकरण चाहिए।जावा जेनरिक, अनबाउंड वाइल्डकार्ड <?> बनाम <Object>

एक वाक्य के अनुसार

:

printList के लक्ष्य को किसी भी प्रकार की एक सूची मुद्रित करने के लिए है, लेकिन यह है कि लक्ष्य को प्राप्त करने में विफल रहता है - यह केवल वस्तु की कई घटनाओं के मुद्रण करता है; यह सूची < इंटीजर >, सूची < स्ट्रिंग >, सूची < डबल >, और इसी तरह, क्योंकि वे सूची < ऑब्जेक्ट > की उपप्रकार नहीं हैं।

यदि मैं यह वाक्य अच्छी तरह से समझता हूं; List<?> और List<Object> के बीच का अंतर यह है कि हम पूर्व को लागू करके टाइप तर्क List<String> या List<Integer> का उपयोग कर सकते हैं। हालांकि अगर हम बाद में लागू करते हैं, तो हम केवल प्रकार तर्क List<Object> का उपयोग कर सकते हैं। जैसे कि List<?>Object अर्थात् List<? Object> के ऊपरी बाउंड है।

लेकिन फिर निम्न वाक्य मुझे भ्रमित करता है, इस अर्थ में कि मैंने जो पहले समझा था, List<Object> में केवल Object वर्ग के उदाहरण होना चाहिए और कुछ और नहीं।

यह ध्यान रखना महत्वपूर्ण है कि List<Object> और List<?> समान नहीं हैं। आप List<Object> में ऑब्जेक्ट, या ऑब्जेक्ट का कोई सबटाइप डाल सकते हैं। लेकिन आप List<?> में केवल null डाल सकते हैं।

+2

मुझे यहां "आप जो पूछ रहे हैं अस्पष्ट" के साथ जाना होगा। – Mena

+0

वह 'एक अतिरिक्त स्पष्टीकरण' चाहता है। – ctst

+0

यह सुनिश्चित नहीं है कि आप कहां से अपनी जानकारी प्राप्त कर रहे हैं, लेकिन आपके द्वारा प्रदान किए गए उदाहरण उदाहरण दोनों गलत हैं। – jervine10

उत्तर

9

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

हालांकि इस तरह की एक विधि:

public void print(List<Number> list); 

वास्तव में केवल एक List जो बिल्कुलList<Number> है ले जाएगा। यह कोई भी सूची नहीं लेगा जिसे List<Integer> घोषित किया गया है।

तो अंतर List<?> जो कुछ भी घोषणा के साथ किसी भी सूची ले जाएगा है, लेकिन List<Object>केवल कुछ है कि घोषितList<Object> के रूप में था ले जाएगा, और कुछ नहीं।

अंतिम उद्धरण केवल यह बताता है कि List<?> एक ऐसी सूची है जिसके लिए आप सचमुच नहीं जानते कि इसकी वस्तुएं किस प्रकार हैं। इसके कारण, आप null के अलावा इसमें कुछ भी नहीं जोड़ सकते हैं।

+0

और 'सूची <के बारे में कैसे? संख्या> 'बढ़ाता है? – biziclop

+2

'सूची 'कम से कम संख्या में * घोषित * की कोई भी सूची लेगी, इसलिए यह' सूची 'और 'सूची ' –

+0

ले सकती है, यह उल्लेखनीय हो सकता है कि' सूची 'कुछ हद तक समान है' सूची 'बढ़ाता है। तो 'सूची ' और 'सूची ' के बीच का अंतर 'सूची ' और 'सूची <' के बीच अंतर की तरह है? संख्या> 'बढ़ाता है। – biziclop

7

जो वाक्य आपको भ्रमित कर रहा है वह आपको चेतावनी देने का प्रयास कर रहा है कि, जबकि List<?> सभी जेनेरिक सूचियों का सुपर-टाइप है, तो आप List<?> संग्रह में कुछ भी नहीं जोड़ सकते हैं।

मान लीजिए आप निम्नलिखित कोड की कोशिश की:

private static void addObjectToList1(final List<?> aList, final Object o) { 
    aList.add(o); 
} 

private static void addObjectToList2(final List<Object> aList, final Object o) { 
    aList.add(o); 
} 

private static <T> void addObjectToList3(final List<T> aList, final T o) { 
    aList.add(o); 
} 


public static void main(String[] args) { 
    List<String> testList = new ArrayList<String>(); 
    String s = "Add me!"; 
    addObjectToList1(testList, s); 
    addObjectToList2(testList, s); 
    addObjectToList3(testList, s); 
} 

addObjectToList1, संकलन नहीं है, क्योंकि आप एक List<?> को null के अलावा कुछ नहीं जोड़ सकते।

addObjectToList2 संकलित (यही कारण है कि वाक्य में बताने के लिए प्रयास कर रहा है।), लेकिन main() में इसे करने के लिए कॉल संकलन नहीं करता, क्योंकि List<Object>List<String> का एक सुपर प्रकार नहीं है।

addObjectToList3 दोनों संकलन और कॉल काम करता है। जेनेरिक सूची में तत्व जोड़ने का यह तरीका है।

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