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




generics inheritance (4)

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

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

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

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

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

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

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

हालांकि 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 के जवाब को देखो।


हम साबित कर सकते हैं कि 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 ?


जेनिक्स के साथ जावा में विधियों के प्रकार यहां दिए गए हैं:

interface Collection<E> {
...
public boolean contains(Object o);
public boolean containsAll(Collection<?> c);
...
}

पहली विधि जेनिक्स का बिल्कुल उपयोग नहीं करती है! दूसरी विधि एक महत्वपूर्ण संक्षेप की हमारी पहली नजर है। प्रकार संग्रह का अर्थ है:

Collection<? extends Object>

ऑब्जेक्ट का विस्तार वाइल्डकार्ड के सबसे आम उपयोगों में से एक है, इसलिए इसे लिखने के लिए एक संक्षिप्त रूप प्रदान करना समझ में आता है।





polymorphism