2015-04-15 8 views
5

मान लीजिए मैं:मैं क्यों स्काला में एफ घिरा वस्तु नहीं बना सकते

trait A[AA <: A[AA]] 
//or even just ` 
trait A[AA] 

यह काम नहीं करता:

scala> object AAA extends A[AAA.type] 
<console>:8: error: illegal cyclic reference involving object AAA 
    object AAA extends A[AAA.type] 
         ^

लेकिन यह काम करता है:

scala> class AAA extends A[AAA]; object AAA extends AAA 
defined class AAA 
defined module AAA 

लगभग (वास्तव में नहीं) वही करना और यह काम करता है। कोई कारण?

पीएस और, कंप्रेसर के अंदर infinte चक्र को मजबूर करने के लिए इस तरह के ऑब्जेक्ट के अंदर वास्तव में can I do क्या है?

+0

http://blog.originate.com/blog/2014/02/27/types-inside-types-in-scala/, मुझे लगता है कि इससे मदद मिलेगी। लेकिन आप किस समस्या को हल करने की कोशिश कर रहे हैं? – Governa

+0

शायद संबंधित: https://issues.scala-lang.org/browse/SI-5082 – Governa

+1

वही प्रश्न यहां: http://stackoverflow.com/questions/17915353/refer-to-object-type-in-object- परिभाषा, लेकिन कोई अच्छा जवाब नहीं –

उत्तर

2

जैसा कि आप अपने शीर्षक में शामिल हैं, कामकाजी मामला class AAA extends A[AAA]F-bounded polymorphism का एक उदाहरण है, जो एक पुनरावर्ती प्रकार की परिभाषा है जहां परिभाषा स्वयं को संदर्भित करती है। रिकर्सन प्रकारों में काफी आम है, यहां तक ​​कि विनम्र List is recursive; यह काफी अच्छी तरह से समझ लिया गया क्षेत्र है।

हालांकि, object AAA extends A[AAA.type] एक पुनरावर्ती प्रकार नहीं है। यहां AAA एक मान है, और आपकी घोषणा संकलक को परिभाषित होने पर किसी मान के प्रकार को संदर्भित करने के लिए कहती है, जो एक क्षमता नहीं है जिसे स्कैला डिजाइन/इरादा किया गया था।

+0

'एएए। टाइप 'एक प्रकार है, मूल्य नहीं है, इसलिए मैं इसका संदर्भ देता हूं, इसलिए यह एफ-बाउंड है। केवल 'एएए' एक मान है यदि आप इसे मान के रूप में उपयोग करते हैं, तो मान लें कि 'वैल ए = एएए'। डिफ़ॉल्ट रूप से यह केवल एक परिभाषा है, जिसमें * दोनों * प्रकार और मान शामिल हैं। – dk14

+0

नहीं। 'एएए' हमेशा एक मूल्य है, कभी भी एक प्रकार नहीं, जब यह एक वस्तु है। –

+0

नहीं। यह एक प्रकार है जब आप 'एएए.टाइप' करते हैं, और, मेरे मामले में यह 'एएए.टाइप' एफ-बाउंड है, जैसे टाइप एएएटीपी <: ए [एएएटीपीई] ' – dk14

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