एक पुस्तकालय डिजाइन करते समय, क्या कोई विशिष्ट प्रश्न हैं जो आपको यह निर्धारित करते समय स्वयं से पूछने चाहिए कि क्या एक प्रकार का पैरामीटर सहसंयोजक या विपरीत होना चाहिए? या आपको सब कुछ अपरिवर्तनीय बनाना चाहिए और फिर आवश्यकतानुसार बदलना चाहिए?
1 उत्तर
अच्छा, सरल, क्या इसका कोई मतलब है? लिस्कोव प्रतिस्थापन के बारे में सोचें।
सहप्रसरण
यदि A <: B
, तो क्या C[A]
पास करने का कोई मतलब है जहां C[B]
अपेक्षित है? अगर ऐसा है, तो इसे C[+T]
बना लें। क्लासिक उदाहरण अपरिवर्तनीय List
है, जहां List[A]
को List[B]
की अपेक्षा करने वाली किसी भी चीज़ को पास किया जा सकता है, यह मानते हुए कि A
B
का एक उपप्रकार है।
दो काउंटर उदाहरण:
उत्परिवर्तनीय अनुक्रम अपरिवर्तनीय हैं, क्योंकि अन्यथा सुरक्षा उल्लंघन होना संभव है (वास्तव में, जावा का सह-संस्करण Array
केवल ऐसी चीजों के लिए असुरक्षित है, यही कारण है कि यह स्कैला में अपरिवर्तनीय है)।
अपरिवर्तनीय Set
अपरिवर्तनीय है, भले ही इसके तरीके अपरिवर्तनीय Seq
के समान हों। अंतर contains
के साथ है, जो सेट पर टाइप किया गया है और अनुक्रमों पर अनटाइप्ड (यानी, Any
स्वीकार करें)। इसलिए, भले ही इसे सह-संस्करण बनाना संभव होगा, एक विशेष विधि पर बढ़ी हुई प्रकार की सुरक्षा की इच्छा ने सह-भिन्नता पर अपरिवर्तन का विकल्प चुना।
कॉन्ट्रा-विचरण
अगर A <: B
, क्या C[B]
पास करने का कोई मतलब है जहां C[A]
अपेक्षित है? अगर ऐसा है, तो इसे C[-T]
बना लें। क्लासिक होने वाला उदाहरण Ordering
है। जबकि कुछ असंबंधित तकनीकी समस्याएं Ordering
को विपरीत-भिन्न होने से रोकती हैं, यह सहज है कि कोई भी चीज जो A
के सुपर-क्लास को ऑर्डर कर सकती है, A
भी ऑर्डर कर सकती है। यह इस प्रकार है कि Ordering[B]
, जो B
प्रकार के सभी तत्वों, A
के एक सुपरटाइप का आदेश देता है, को Ordering[A]
की अपेक्षा करने वाली किसी चीज़ को पास किया जा सकता है।
जबकि स्काला का Ordering
contra-variant नहीं है, Scalaz का आदेश अपेक्षा के अनुरूप भिन्न-भिन्न है। स्कालाज़ का एक अन्य उदाहरण इसका Equal है विशेषता
मिश्रित भिन्नता?
स्कैला में मिश्रित भिन्नता का सबसे दृश्यमान उदाहरण Function1
(और 2, 3, आदि) है। इसे प्राप्त होने वाले पैरामीटर में यह कॉन्ट्रा-वेरिएंट है, और जो रिटर्न करता है उसमें को-वेरिएंट है। ध्यान दें, हालांकि, Function1
का उपयोग बहुत सारे क्लोजर के लिए किया जाता है, और क्लोजर का उपयोग कई जगहों पर किया जाता है, और ये स्थान आमतौर पर होते हैं जहां जावा सिंगल एब्सट्रैक्ट मेथड क्लासेस का उपयोग करता है (या उपयोग करेगा)।
इसलिए, यदि आपके पास ऐसी स्थिति है जहां एक एसएएम वर्ग लागू होता है, तो यह संभवतः मिश्रित विपरीत-भिन्नता और सह-भिन्नता के लिए एक जगह है।