java - सूची<?> सूची<Integer> और सूची<संख्या> के सामान्य अभिभावक है?




generics inheritance (4)

इस ओरेकल ट्यूटोरियल से ,

हालांकि Integer Number उप प्रकार है, List<Integer> List<Number> का उप प्रकार नहीं है और वास्तव में, इन दो प्रकार से संबंधित नहीं हैं।

List<Number> और List<Integer> का सामान्य अभिभावक List<?>

मेरा सवाल दूसरी वाक्य के बारे में है। हम कैसे कह सकते हैं कि List<?> List<Number> और List<Integer> का सामान्य अभिभावक है?

? एक अज्ञात प्रकार के लिए खड़ा है, जो कोई संदर्भ प्रकार हो सकता है। भले ही मैं यह कहूं ? Object यहां होगा, Object Integer और Number का सामान्य अभिभावक होने का मतलब यह नहीं है कि List<Object> List<Integer> और List<Number> एक सामान्य अभिभावक बन जाता है।


आप ओओपी विरासत या ठोस प्रकारों की अवधारणाओं को मिश्रित कर रहे हैं जो सामान्य जेनेरिक और उन जेनेरिकों के बीच संबंधों में से एक हैं।

वाइल्डकार्ड और उप प्रकार के बारे में ट्यूटोरियल में एक वाक्य यह सब कहता है:

इन वर्गों के बीच संबंध बनाने के लिए ... ऊपरी बाउंड वाले वाइल्डकार्ड का उपयोग करें

सामान्य प्रकार के संबंधों के लिए ? संभव वाइल्डकार्ड से सबसे ऊपरी सीमा है ? extends <type> ? extends <type> (ऊपरी बाउंड वाइल्डकार्ड) ? extends <type> ? super <type> ? super <type> (निचला बाउंड वाइल्डकार्ड) और वास्तविक type (सटीक मिलान या "ऊपरी और निचले बाउंड वाले वाइल्डकार्ड")।

वाइल्डकार्ड का उपयोग जेनिक्स और ओओपी दोनों अवधारणाओं को एक-दूसरे के साथ अच्छी तरह से काम करने के लिए किया जाता है लेकिन यह वही नहीं है। सीधे शब्दों में कहें: List<?> List<Integer> और List<Number> का सामान्य अभिभावक है क्योंकि वाइल्डकार्ड संबंध इस तरह निर्दिष्ट है कि कोई अन्य वाइल्डकार्ड एक उपप्रकार संबंध बनाता है ? । यह अनौपचारिक स्पष्टीकरण कम या कम है, विनिर्देश के ठोस भागों के लिए dejvuth के जवाब को देखो।


जिस संदर्भ को आपको समझने की आवश्यकता है वह Integer या Number का नहीं है लेकिन यह List । आइए मान लीजिए कि आप List वर्ग बना रहे थे तो आप कक्षा कैसे बनाएंगे ताकि यह केवल एक विशिष्ट प्रकार की कक्षा का समर्थन करे।

हां, वह List वर्ग ऑब्जेक्ट का उपयोग अपने प्रकार के रूप में नहीं करेगा बल्कि इसके बजाय एक वाइल्ड कार्ड का उपयोग करेगा ?

वाइल्डकार्ड के दस्तावेज के रूप में कहते हैं

तो सभी प्रकार के संग्रहों का सुपरटेप क्या है? यह Collection<?> लिखा है Collection<?> (उच्चारण "अज्ञात संग्रह")

सूची के लिए वही बात कहा जा सकता है।

तो सभी प्रकार की सूचियों का सुपरटेप क्या है? यह लिखित List<?> (उच्चारण "अज्ञात की सूची") है


ट्यूटोरियल वाइल्डकार्ड के बारे में है। तो वे समझाना चाहते हैं कि आपको कब और कैसे उपयोग करना चाहिए। जब आप आगे पढ़ते हैं तो उदाहरण कोड होता है:

List<? extends Integer> intList = new ArrayList<>();
List<? extends Number>  numList = intList;  // OK. List<? extends Integer> is a subtype of List<? extends Number>

यदि आप केवल यह असाइनमेंट कर सकते हैं तो ? Integer और Number का आम अभिभावक है। मुझे लगता है कि वाइल्डकार्ड और जेनेरिक के संबंध में यह कहना संभव है कि:

List<?> List<Number> और List<Integer> का सामान्य अभिभावक है

क्योंकि ट्यूटोरियल के संदर्भ को देखना जरूरी है।


हम साबित कर सकते हैं कि List<?> List<Number> और List<Integer> का एक सुपरटेप है।

जेएलएस 4.10.2 से (जोर मेरा):

एक सामान्य प्रकार की घोषणा सी <एफ 1, ..., एफएन> (एन> 0), पैरामीटरयुक्त प्रकार C<T1,...,Tn> के प्रत्यक्ष supertypes , जहां टीआई (1 ≤ i ≤ n) एक दिया गया है टाइप करें, निम्नलिखित सभी हैं:

  • ...

  • C<S1,...,Sn> , जहां Si में Ti (1 ≤ i ≤ n) (§4.5.1) है

List और n=1 साथ C को प्रतिस्थापित करके, हम जानते हैं कि List<?> List<Number> और List<Integer> का प्रत्यक्ष supertype है ? Number और Integer

हम यह साबित कर सकते हैं ? Number और Integer क्योंकि जेएलएस 4.5.1 से :

वाइल्डकार्ड ? extends Object ? extends Object unbounded वाइल्डकार्ड के बराबर है ?

और आगे:

एक प्रकार तर्क तर्क T1 में कहा जाता है कि T2 T2 <= T1 लिखा गया है, यदि T2 द्वारा निर्दिष्ट प्रकारों का सेट निश्चित रूप से निम्नलिखित नियमों के रिफ्लेक्सिव और ट्रांजिटिव क्लोजर के तहत T1 द्वारा निर्दिष्ट प्रकारों के सेट का सबसेट है, जहां <: subtyping इंगित करता है (§4.10)):

  • ? extends T ? extends T <= ? extends T ? extends S ? extends S अगर टी <: एस
  • ...
  • T <= ? extends T ? extends T

हम उपरोक्त नियमों का उपयोग यह साबित करने के लिए कर सकते हैं कि Number <= ? , क्योंकि Number <= ? extends Number ? extends Number <= ? extends Object ? extends Object = ? extends Object ?





polymorphism