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))
它不编译:类型不匹配;
{{1}}
答案 0 :(得分:3)
您可以声明doSomething
和myType
使用与路径无关的版本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)
}
答案 1 :(得分:0)
我很确定你不能这样做,因为与路径无关的类型只是 - 如果A<> B然后A#T与B#T严格不同(即A#T将永远 = =:= B#T)。
话虽如此,施放是安全的,所以你总是可以做someA.doSomething(myType.asInstanceOf[someA#MyType])
之类的事情。丑陋但有效。