2012-05-31 2 views
5

def someA (trait B에서)은 B과 같은 C#MyType과 동일한 trait A을 사용합니까? (그런 다음 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") 

} 

컴파일되지 않습니다. 형식이 일치하지 않습니다. 당신은 MyType의 경로 독립 버전을 사용 doSomethingmyType을 선언 할 수 있습니다

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

답변

3

, 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

좋아, 컴파일되지만 더 구체적인 SomeType을 B와 섞을 수는 없습니다. – jwinandy

0

난 당신이 할 수 없어 확실 해요 그 경우 A <> B이면 A # T는 B # T와 완전히 다릅니다 (예 : A # T는 이 아닙니다.이어야 함 = B = T).

그렇다면 캐스팅하는 것이 안전하므로 항상 someA.doSomething(myType.asInstanceOf[someA#MyType])과 같은 것을 할 수 있습니다. 추악하지만 작동합니다.

+0

작동하지 않습니까? 불안정한 식별자를 사용할 수 없다는 뜻입니다. – jwinandy