2010-02-02 8 views
13

में एक आंतरिक वर्ग के प्रकार का जिक्र करते हुए निम्नलिखित कोड की नकल करने की कोशिश करता है: Inner में व्यवहार देने के बजाय, यह useInner में अपनी संलग्न कक्षा के तरीके को एन्कोड किया गया है। मैंने enclosing विधि जोड़ा ताकि उपयोगकर्ता को केवल Inner उदाहरणों का संदर्भ रखना पड़े, लेकिन हमेशा उनका संलग्न उदाहरण प्राप्त हो सकता है। ऐसा करके, सभी Inner एक विशिष्ट Outer उदाहरण से उदाहरण केवल एक व्यवहार से बंधे हैं (लेकिन यह यहां चाहता था)।स्कैला

abstract class Outer { 
    sealed class Inner { 
    def enclosing = Outer.this 
    } 
def useInner(x:Inner) : Boolean 
} 

def toBoolean(x:Outer#Inner) : Boolean = x.enclosing.useInner(x) 

यह संकलन नहीं है और स्केला 2.8 के बारे में शिकायत:

type mismatch; found: sandbox.Outer#Inner 
       required: _81.Inner where val _81:sandbox.Outer 

Programming Scala: Nested classes और A Tour of Scala: Inner Classes से, मुझे लगता है समस्या यह है कि तर्क के रूप में useInner उम्मीद एक विशिष्ट Outer उदाहरण से एक Inner उदाहरण ।

सही स्पष्टीकरण और इस समस्या को हल करने का तरीका क्या है?

उत्तर

16

मुझे लगता है कि प्रकार इनर इस प्रकार की तरह है। आंतरिक। बाहरी # आंतरिक बाहरी उदाहरण से स्वतंत्र है (पथ-निर्भर प्रकार नहीं)।

abstract class Outer { 
    sealed class Inner { 
    def enclosing = Outer.this 
    } 
    def useInner(x:Outer#Inner) : Boolean 
} 

def toBoolean(x:Outer#Inner) : Boolean = x.enclosing.useInner(x) 
+0

क्या यह संभव है उपयोग करने के बजाय Booolean को संशोधित करने के लिए? –

+0

यदि 'def toBoolean (x: y.Inner forSome {val y: Outer}) की कोशिश की गई है: Boolean = x.enclosing.useInner (x) '(मौजूदा प्रकार - स्कैला संदर्भ से मानों पर मौजूदा मात्रा) लेकिन यह नहीं था काम। –

4

समस्या के रूप में आप का वर्णन है, कि useInner एक विशिष्ट Outer उदाहरण के Inner उम्मीद कर रही है। चूंकि enclosing एक सामान्य Outer देता है, इसलिए मुझे पता है कि दोनों को एक साथ बांधने का कोई तरीका नहीं है।

आप, यह मजबूर कर सकते हैं, लेकिन:

def toBoolean(x: Outer#Inner): Boolean = { 
    val outer = x.enclosing 
    outer.useInner(x.asInstanceOf[outer.Inner]) 
} 
0

आप भी इस तरह अपने सदस्य को परिभाषित कर सकते हैं:

def useInner(x:Outer#Inner) : Boolean 

या आप इस तरह लिख सकते हैं:

abstract class Outer { 
    class InnerImpl { 
     def enclosing = Outer.this 
    } 
    final type Inner = Outer#InnerImpl 
    def useInner(x:Inner) : Boolean 
}