2012-05-31 15 views
5

def someAtrait B)はBと同じC#MyTypetrait Aを使用しますか? (Then 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はとなる。はbe =:= B#Tとなる)。

キャストするのが安全だと言われているので、いつでもsomeA.doSomething(myType.asInstanceOf[someA#MyType])のようなことをすることができます。醜いが動作する。

+0

これは機能しませんか?私はあなたが不安定な識別子にキャストできないことを意味します。 – jwinandy

関連する問題