5

と同じようにdef someA(でtrait B)どのように使用できますか?(その後)trait AC#MyTypeBA#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))
4

2 に答える 2

3

パスに依存しないバージョンの、:を宣言doSomethingして使用できます。myTypeMyTypeSomeType#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)
}
于 2012-05-31T10:29:05.020 に答える
0

パスに依存しない型はそれだけなので、それはできないと確信しています-A <> Bの場合、A#TはB#Tとは厳密に異なります(つまり、A#Tは決して=:= B#にはなりません) T)。

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

于 2012-05-31T13:04:05.360 に答える