2011-11-08 26 views
67

मैं पहले इस्तेमाल किसी भी वस्तु मतलब करने के लिए वाइल्डकार्ड देखा है - लेकिन हाल ही में एक प्रयोग देखा: चूंकि सभी वस्तुओं वस्तु का विस्तार<?> और <के बीच क्या अंतर है? जावा जेनरिक में ऑब्जेक्ट> बढ़ाता है?

<? extends Object> 

, इन दोनों उपयोगों के पर्याय बन गया है?

+2

यह वही बात है। Http://stackoverflow.com/questions/2274720/java-extends-object-question – Dan

+3

@Dan देखें यदि आप उस प्रश्न में "ऑब्जेक्ट बढ़ाते हैं" खोजते हैं तो आपको कुछ भी नहीं मिलता है। मैं जवाब देखने के माध्यम से पढ़ रहा हूं कि क्या मैं कुछ भी अनुमान लगा सकता हूं लेकिन मुझे नहीं लगता कि यह है। विशेष रूप से, यह जेनेरिक के बारे में बात नहीं कर रहा है। – orbfish

+0

@Dan - यह एक अलग सवाल है। मैंने पहले इस सवाल को देखा है और मुझे कम से कम एक सूक्ष्म अंतर का उल्लेख याद है। मुझे देखने दो कि क्या मैं इसे पा सकता हूं .. –

उत्तर

77

<?> और <? extends Object> समानार्थी हैं, जैसा कि आप उम्मीद करेंगे, लेकिन जेनेरिक के साथ कुछ मामले हैं जहां extends Object वास्तव में अनावश्यक नहीं है। उदाहरण के लिए, <T extends Object & Foo>T को Object बनने के कारण <T extends Foo> के साथ Foo मिटा देगा। (यदि आप एक पूर्व जेनरिक एपीआई कि Object इस्तेमाल किया के साथ संगतता बनाए रखने के लिए कोशिश कर रहे हैं कोई फर्क कर सकते हैं।)

(स्रोत: http://download.oracle.com/javase/tutorial/extra/generics/convert.html, यह बताता है कि क्यों JDK के java.util.Collections वर्ग इस हस्ताक्षर के साथ एक विधि है:

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) 

।)

+4

मुझे अस्पष्ट है कि उदाहरण कैसे संबंधित है? (क्योंकि यह न तो का उपयोग करता है और न ही <ऑब्जेक्ट बढ़ाता है) – orbfish

+5

+1 बहुत दिलचस्प है। –

+22

@orbfish: यह केवल उसमें से संबंधित है, मैंने सोचा था कि आपको यह दिलचस्प लगेगा, क्योंकि यह एक ऐसा उदाहरण है जहां 'ऑब्जेक्ट' वास्तव में * अर्थपूर्ण * है। अगर मैं गलत था, तो मैं क्षमा चाहता हूं। उम्मीद है कि कम से कम आपके प्रश्न में आने वाले अन्य लोगों के लिए यह रूचि होगी। – ruakh

17

हालांकि <?><? extend object> के लिए एक शॉर्टकट माना जाता है, दोनों के बीच एक छोटे से अंतर है। <?> उत्तरदायी है जबकि <? extend object> नहीं है। कारण यह है कि वे पुनः प्राप्त करने योग्य प्रकार को अलग करना आसान बनाते हैं। <? extends something>, <T>, <Integer> जैसी कोई भी चीज़ अपरिहार्य है।

उदाहरण के लिए, इस कोड को

List aList = new ArrayList<>(); 
boolean instanceTest = aList instanceof List<?>; 

काम करेगा, लेकिन इस बारे में अधिक जानकारी के लिए एक त्रुटि

List aList = new ArrayList<>(); 
boolean instancetest = aList instanceof List<? extends Object>; 

देता मौरिस नफ्तालिन

+0

सूची कैसे पुन: प्रयोज्य हो सकती है यदि संकलक इसे सूची में अनुवाद करेगा, तो किस प्रकार के बारे में जानकारी है? खो गया? – Trismegistos

+0

मुझे विश्वास है कि विरासत एपीआई के साथ पिछड़े संगत के लिए अधिक डिज़ाइन किया गया है। और <के साथ अंतर करने के लिए? ऑब्जेक्ट बढ़ाता है> जो जावा 5 कोड पोस्ट कर रहे हैं। –

2

<?> द्वारा जावा जेनरिक और संग्रह पढ़ के लिए एक आशुलिपि है <? extends Object>। अधिक जानकारी के लिए आप नीचे साझा लिंक पढ़ सकते हैं।


<?> 

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

ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number 
unknownList = new ArrayList<Float>(); //Float is of type Number 

नोट:<?> anythings का मतलब है। तो यह उस प्रकार को स्वीकार कर सकता है जो Object कक्षा से विरासत में नहीं मिला है।

<? extends Object> 

<? extends Object> आप एक वस्तु या एक उप-वर्ग कि Object वर्ग फैली पारित कर सकते हैं मतलब है।

ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass 
numberList = new ArrayList<Integer>(); //Integer extends Number 
numberList = new ArrayList<Float>(); // Float extends Number 

enter image description here

टी - निरूपित करने के लिए प्रकार
ई इस्तेमाल किया - कुंजी
वी - - तत्व को निरूपित करने के
कश्मीर इस्तेमाल किया महत्व देता
एन - संख्या के लिए
Ref:

enter image description here

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