Для тех, кто интересуется этой экзотической проблемой, я обнаружил, что она работает также как возвращаемое значение функции. Поскольку мои черты A и B имеют параметры типа, это должно привести к более краткому коду:
trait A[T, U, V] {
class X {
def x() = "A.X"
}
def a = this:A[T, U, V]
}
trait B[T, U, V] extends A[T, U, V] {
class X extends super.X {
override def x() = "B.X"
}
}
class C extends B[SomeClass, SomeOtherClass, ThirdOne] {
val aVerbose = this:A[SomeClass, SomeOtherClass, ThirdOne] // works but is a bit ugly
val aConcise = a
val x = new this.X()
val y = new aVerbose.X()
val z = new aConcise.X()
}
scala> val c = new C()
c: C = C@1e852be
scala> c.x.x()
res2: java.lang.String = B.X
scala> c.y.x()
res3: java.lang.String = A.X
scala> c.z.x()
res4: java.lang.String = A.X