2012-05-31 15 views
5

def someA (trait B में) trait A का उपयोग C#MyType के साथ B में किया जा सकता है? (फिर A#MyType =:= B#MyType)केक पैटर्न और प्रकार

trait C { 
    type MyType 
} 


trait A { 
    self: C => 
    def doSomething(s: MyType) { println(s.toString)} 
} 

trait B { 
    self: C => 

    def someA: A 
    def myType: MyType 

    def action = someA.doSomething(myType) 
} 

// Mix part 

case class Ahoy(value: String) 

trait ConcreteC extends C { 
    type MyType = Ahoy 
} 


class PieceOfCake extends B with ConcreteC { 
    val someA = new A with ConcreteC 
    val myType = Ahoy("MyType") 

} 

यह संकलन नहीं करता है: प्रकार मेल नहीं खाता;

[error] found : B.this.MyType 
[error] required: _1.MyType where val _1: A 
[error] def action = someA.doSomething(myType)) 

उत्तर

3

आप MyType की राह स्वतंत्र संस्करण का उपयोग करने doSomething और myType घोषणा कर सकते हैं, SomeType#MyType:

trait SomeType { 
    type MyType 
} 


trait A { 
    self: SomeType => 
    def doSomething(s: SomeType#MyType) { println(s.toString)} 
} 

trait B { 
    self: SomeType => 

    def someA: A 
    def myType: SomeType#MyType 

    def action = someA.doSomething(myType) 
} 
+0

ठीक है, यह संकलित करता है, लेकिन आप बी – jwinandy

0

मैं, सुंदर आप ऐसा नहीं कर सकते यकीन है के बाद से पथ-स्वतंत्र प्रकार बस कर रहे हैं कि - यदि ए <> बी तो ए # टी बी # टी से सख्ती से अलग है (यानी ए # टी कभी होना =: = बी # टी) है।

कहा जा रहा है कि यह कास्ट करना सुरक्षित है, ताकि आप हमेशा someA.doSomething(myType.asInstanceOf[someA#MyType]) जैसे कुछ कर सकें। बदसूरत लेकिन काम करता है।

+0

के साथ एक और विशिष्ट कुछ प्रकार का मिश्रण नहीं कर सकते हैं यह काम नहीं करता है? मेरा मतलब है कि आप एक अस्थिर पहचानकर्ता पर नहीं डाल सकते हैं। – jwinandy

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