abstract class FooA { type A <: Ax; abstract class Ax; abstract class InnerA { type B <: A; def doB : B; } } trait FooB extends FooA { type A <: Axx; trait Axx extends super.Ax { def xxx : Int; } abstract class InnerB extends InnerA { // type B <: A; val a : A = doB; a.xxx; doB.xxx; } }