<?> और <के बीच अंतर क्या है? जावा जेनरिक में ऑब्जेक्ट> का विस्तार


94

मैंने देखा है कि वाइल्डकार्ड का उपयोग किसी भी वस्तु से पहले किया जाता है - लेकिन हाल ही में इसका उपयोग देखा गया है:

<? extends Object>

चूँकि सभी ऑब्जेक्ट ऑब्जेक्ट का विस्तार करते हैं, क्या ये दो प्रयोग पर्यायवाची हैं?


2
एक ही बात है। देखें stackoverflow.com/questions/2274720/...
दान

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

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

यदि आप इसे
ढूंढते

1
यहाँ हम जाते हैं: जावा में अनबाउंड वाइल्डकार्ड्स का संभावित डुप्लिकेट (किसी भी तरह से केविन बोर्रिलिन द्वारा गलत उत्तर न देना।)
पॉल एक्स बेलोरा 8'11 '18:49

जवाबों:


103

<?>और <? extends Object>पर्यायवाची हैं, जैसा कि आप उम्मीद करेंगे।

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

स्रोत: 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

27
@orbfish: यह केवल उसी से संबंधित है जिसमें मुझे लगा कि आप इसे दिलचस्प पाएंगे, क्योंकि यह एक उदाहरण है जहां extends Objectवास्तव में सार्थक है। अगर मुझसे गलती हुई, तो मैं माफी मांगता हूं। उम्मीद है कि यह कम से कम आपके सवाल पर आने वाले अन्य लोगों के लिए दिलचस्पी का होगा।
21

@ruakh - टाइप मापदंडों के बजाय बाउंडेड वाइल्डकार्ड में रुचि रखते थे, लेकिन, कम से कम, आपने जवाब दिया।
20

1
आपको अपने मूल पद में तब यह बताना चाहिए था। इस तरह, उसका जवाब आपके लिए अधिक प्रासंगिक हो सकता है।
liltitus27

19

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

उदाहरण के लिए, यह कोड काम करेगा

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

लेकिन यह एक त्रुटि देता है

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

अधिक जानकारी के लिए मौरिस नाफ्टलिन द्वारा जावा जेनरिक और संग्रह पढ़ें


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

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

9

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


<?>

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

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

नोट: <?> मतलब किसी भी। तो यह उस प्रकार को स्वीकार कर सकता है जो 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 

यहां छवि विवरण दर्ज करें

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

यहां छवि विवरण दर्ज करें


"तो यह उस प्रकार को स्वीकार कर सकता है जो ऑब्जेक्ट क्लास से विरासत में नहीं मिला है", लेकिन सभी जावा कक्षाएं विरासत में मिली हैं या अंतर्निहित रूप से Objectवर्ग से विरासत में मिली हैं ।
हैकजुत्सु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.