2013-02-18 12 views
5

मैं चारों ओर एक सा खोज की है, लेकिन मैं इस तरह की संरचना का एक उदाहरण खोजने के लिए सक्षम नहीं था:Selfreferencing जेनेरिक्स

Person[P <: Person[P]] 

कि एक तरह से मुझे समझ में समझाया गया है।

यह कैसे हल करता है? यह मुझे एक अंतहीन पुनरावृत्ति की तरह दिखता है, लेकिन ऐसा लगता है कि मैं उस निष्कर्ष के साथ गलत हूं।

उत्तर

5

संरचना स्वयं को Twitter Scala School में समझाया गया है और इसे एफ-बाध्य पॉलीमोर्फिज्म कहा जाता है।

// you define it like this 
trait X extends Person[X] 

// it then gets expanded to this 
trait Person[X extends Person[X]] 

यह संरचना तब उपयोग की जाती है जब विशेषता को उस वस्तु के प्रकार के संदर्भ में संदर्भित करने की आवश्यकता होती है जो यह विस्तार कर रहा है। स्काला स्कूल स्पष्टीकरण पर्याप्त नहीं है, तो आप 'एफ घिरा बहुरूपता'

+1

एफ-बाध्य पॉलीमोर्फिज्म ... हाँ, मैं कभी भी इसे खोजने में सक्षम नहीं होता। धन्यवाद, मुझे लगता है कि मुझे अब मिल गया है। –

+0

जहां आपने अंतिम पंक्ति में 'विस्तार' किया है, तो क्या आपका मतलब '<:' है? – AmigoNico

+0

मैं दोनों में से एक को चुनने के लिए आगे और आगे कूद रहा हूं। क्या आपको लगता है कि '<:' बेहतर होता? उदाहरण के लिए – EECOLOR

5

यह कभी कभी एक स्वयं प्रकार कहा जाता है के लिए इंटरनेट पर खोज कर सकते हैं (स्काला का स्पष्ट रूप से टाइप किया आत्म संदर्भ के साथ भ्रमित होने की नहीं) और यह आमतौर पर है विधि हस्ताक्षर करने के लिए उपयोग किया जाता है जो व्यक्त करने के लिए पर्याप्त मजबूत है कि विधि रिसीवर के समान प्रकार की वस्तुओं के साथ काम करती है।

चलिए एक उदाहरण देखें। कहें, आपके पास एक सामान्य 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 पहले ही बताया, इसके पीछे प्रकार सिद्धांत कहा जाता है एफ घिरा बहुरूपता

+0

उदाहरण के लिए धन्यवाद, एक साथ EECOLOR के लिंक के साथ मुझे लगता है कि मैं वास्तव में समझता हूं कि मेरे सामने मेरे कोड में यह क्या अच्छा है ^^ –

संबंधित मुद्दे