यह कभी कभी एक स्वयं प्रकार कहा जाता है के लिए इंटरनेट पर खोज कर सकते हैं (स्काला का स्पष्ट रूप से टाइप किया आत्म संदर्भ के साथ भ्रमित होने की नहीं) और यह आमतौर पर है विधि हस्ताक्षर करने के लिए उपयोग किया जाता है जो व्यक्त करने के लिए पर्याप्त मजबूत है कि विधि रिसीवर के समान प्रकार की वस्तुओं के साथ काम करती है।
चलिए एक उदाहरण देखें। कहें, आपके पास एक सामान्य breed
विधि के साथ Animal
आधारभूत विशेषता है जो Animal
लेता है और Animal
देता है।
trait Animal {
def breed(a: Animal): Animal
}
ठीक है, लेकिन क्या आप वास्तव में चाहते हैं एक breed
विधि है कि व्यक्त करता है कि हर ठोस पशु केवल एक ही कक्षा के जानवरों के साथ जन्म देती है और यह भी एक ही कक्षा के एक जानवर देता है। क्योंकि इस breed
के हस्ताक्षर से मेल नहीं खाता निम्नलिखित कार्यान्वयन
class Cow extends Animal {
def breed(c: Cow) = new Cow
}
संभव नहीं है,। ओवरराइडिंग भी संभव नहीं है, क्योंकि आपको तर्क प्रकार को बदलना होगा, जिसे वर्जित किया गया है।
बचाव के लिए स्व प्रकार:
trait Animal[A <: Animal[A]] {
def breed(a: A): A
}
class Cow extends Animal[Cow] {
def breed(c: Cow) = new Cow
}
रूप EECOLOR पहले ही बताया, इसके पीछे प्रकार सिद्धांत कहा जाता है एफ घिरा बहुरूपता।
स्रोत
2013-02-18 16:11:05
एफ-बाध्य पॉलीमोर्फिज्म ... हाँ, मैं कभी भी इसे खोजने में सक्षम नहीं होता। धन्यवाद, मुझे लगता है कि मुझे अब मिल गया है। –
जहां आपने अंतिम पंक्ति में 'विस्तार' किया है, तो क्या आपका मतलब '<:' है? – AmigoNico
मैं दोनों में से एक को चुनने के लिए आगे और आगे कूद रहा हूं। क्या आपको लगता है कि '<:' बेहतर होता? उदाहरण के लिए – EECOLOR