चूंकि किसी और ने इस सवाल का जवाब नहीं दिया है, मुझे लगता है कि मैं इसे खुद जाने दूंगा। मैं थोड़ा दार्शनिक होने जा रहा हूँ।
जेनेरिक प्रोग्रामिंग सभी प्रकार की जानकारी के नुकसान के बिना, समान प्रकार पर अमूर्त करने के बारे में है (जो कि वस्तु-उन्मुख मूल्य बहुरूपता के साथ होता है)। ऐसा करने के लिए, प्रकारों को आवश्यक रूप से कुछ प्रकार के इंटरफ़ेस (संचालन का एक सेट, ओओ अवधि नहीं) का उपयोग करना चाहिए जिसे आप उपयोग कर सकते हैं।
ऑब्जेक्ट-ओरिएंटेड भाषाओं में, प्रकार वर्गों के आधार पर एक इंटरफ़ेस को संतुष्ट करते हैं। प्रत्येक वर्ग का अपना इंटरफ़ेस होता है, जिसे उसके प्रकार के भाग के रूप में परिभाषित किया जाता है। चूँकि सभी कक्षाएं List<T>
समान इंटरफ़ेस साझा करती हैं, आप कोड लिख सकते हैं जो बिना किसी काम के काम करता है T
। इंटरफ़ेस लागू करने का एक और तरीका एक विरासत की कमी है, और यद्यपि दोनों अलग-अलग लगते हैं, यदि आप इसके बारे में सोचते हैं तो वे समान हैं।
अधिकांश वस्तु-उन्मुख भाषाओं में, List<>
अपने आप में एक उचित प्रकार नहीं है। इसकी कोई विधियाँ नहीं हैं, और इस प्रकार इसका कोई इंटरफ़ेस नहीं है। केवल यह है List<T>
कि ये चीजें हैं। अनिवार्य रूप से, अधिक तकनीकी शब्दों में, एकमात्र प्रकार जिसे आप सार्थक रूप से सार कर सकते हैं, वे हैं *
। एक वस्तु-उन्मुख दुनिया में उच्च-प्रकार के प्रकारों का उपयोग करने के लिए, आपको इस प्रतिबंध के अनुरूप एक प्रकार से बाधाओं को वाक्यांश करना होगा।
उदाहरण के लिए, टिप्पणी में उल्लेख किया है, हम देख सकते हैं Option<>
और List<>
के रूप में "mappable", अर्थ में अगर आप एक समारोह है, तो आप एक परिवर्तित कर सकते हैं कि Option<T>
एक में Option<S>
, या एक List<T>
एक में List<S>
। यह याद रखना कि कक्षाओं का उपयोग सीधे उच्च प्रकारों पर अमूर्त करने के लिए नहीं किया जा सकता है, हम इसके बजाय एक इंटरफ़ेस बनाते हैं:
IMappable<K<_>, T> where K<T> : IMappable<K<_>, T>
और फिर हम दोनों में इंटरफ़ेस को लागू List<T>
करने और Option<T>
के रूप में IMappable<List<_>, T>
और IMappable<Option<_>, T>
क्रमशः। हमने जो किया है, वह वास्तविक (गैर-उच्च-प्रकार) प्रकारों पर अवरोधों को लगाने के लिए उच्च-प्रकार के प्रकारों का उपयोग कर रहा है Option<T>
और List<T>
। यह स्काला में कैसे किया जाता है, हालांकि निश्चित रूप से स्काला में लक्षण, प्रकार चर, और अंतर्निहित पैरामीटर जैसी विशेषताएं हैं जो इसे अधिक अभिव्यंजक बनाते हैं।
अन्य भाषाओं में, उच्चतर प्रकार के सीधे पर अमूर्त करना संभव है। हास्केल में, सिस्टम के उच्चतम अधिकारियों में से एक, हम किसी भी प्रकार के लिए एक टाइप क्लास वाक्यांश कर सकते हैं, भले ही वह उच्च प्रकार का हो। उदाहरण के लिए,
class Mappable mp where
map :: mp a -> mp b
यह सीधे एक (अनिर्दिष्ट) प्रकार पर रखा गया एक अवरोध है mp
जो एक प्रकार का पैरामीटर लेता है, और इसे उस फ़ंक्शन के साथ जुड़ा होना चाहिए map
जो एक mp<a>
में बदल जाता है mp<b>
। फिर हम ऐसे कार्यों को लिख सकते हैं जो उच्च-प्रकार के प्रकारों को विवश करते हैं Mappable
जैसे कि ऑब्जेक्ट-ओरिएंटेड भाषाओं में आप एक विरासत बाधा डाल सकते हैं। अच्छी तरह की।
चीजों को योग करने के लिए, उच्च-प्रकार के प्रकारों का उपयोग करने की आपकी क्षमता उन्हें विवश करने या उन्हें प्रकार की बाधाओं के भाग के रूप में उपयोग करने की आपकी क्षमता पर निर्भर करती है।