में कॉन्वर्सिस नोटेशन या जेनेरिक सीमाओं का उपयोग करते समय स्कैला भिन्नता को सामान्य प्रकार के तर्क पर + और - जैसे भिन्न ऑपरेटरों के साथ परिभाषित किया जा सकता है। उदाहरण के लिए List
प्रकार मानक पुस्तकालय में covariant है।स्कैला
class List[+A]
तो एक covariant सूची के साथ एक समारोह इस तरह परिभाषित किया जा सकता:
def foo[A](list : List[A])
भी विचरण सामान्य सीमा के साथ नकल करते जा सकता है। तो हम भी, इस
def foo[A](list : List[_:< A])
निश्चित रूप से यह कोई मतलब नहीं है लिख सकते हैं क्योंकि list
पहले से ही covariant है। लेकिन वही चाल उन प्रकारों के लिए की जा सकती है जो कॉन्वेंट नहीं हैं। (जैसे Stack
)। बेशक, स्टैक (एकत्रीकरण की विरासत) से भी एक नए प्रकार का निर्माण किया जा सकता है जो कि कॉन्वर्सेंट है।
तो मेरे सवालों का:
- जब विचरण के लिए सामान्य सीमा का उपयोग किया जाना चाहिए? और हमें एक नया कॉन्वेंट प्रकार कब बनाना चाहिए?
- सामान्य सीमाएं केवल भिन्नता के लिए उपयोगी हैं, या वे अधिक (भाषा अवधारणाओं) घोषित कर सकते हैं।
- यदि वे केवल भिन्नता के लिए उपयोगी हैं, तो केवल जावा के साथ संगतता के लिए सीमाएं हैं?
अग्रिम :)
मैं इस सवाल को दोगुना करता हूं - भिन्नता स्कैला का सबसे कठिन हिस्सा है और मैं वास्तव में इसे अच्छी तरह समझ नहीं पा रहा हूं। "Blah-blah covariant blah contravariant स्थिति blah-blah में दिखाई दिया": पी – Jeriho
जब मैंने कुछ फ़ंक्शन गुणों (फ़ंक्शन 1, फ़ंक्शन 2, आदि) की परिभाषाओं को देखा तो मुझे भिन्नता दिखाई दी। फ़ंक्शन विशेषता आउटपुट प्रकार पर सभी कॉन्वर्सेंट हैं और इनपुट (पैरामीटर) प्रकारों पर contravariant। उदाहरण के लिए, 'Any => यूनिट' प्रकार का एक फ़ंक्शन तब भी उपयोग किया जा सकता है जहां 'स्ट्रिंग => यूनिट' प्रकार के फ़ंक्शन की अपेक्षा की जाती है, क्योंकि 'Any => Unit' फ़ंक्शन स्ट्रिंग को इसके इनपुट के रूप में ले सकता है (क्योंकि यह कर सकता है इसके इनपुट के रूप में कुछ भी ले लो।) यही कारण है कि विधि पैरामीटर के प्रकार एक "contravariant स्थिति" हैं। –