What you are asking about is called F-bound types, and this is the best explanation I've seen on the topic: https://tpolecat.github.io/2015/04/29/f-bounds.html

The punch line is that you'll either want to switch to using typeclasses rather than inheritance, or you'll have to settle for getting almost all the way to what you want, like this:

trait BaseTrait[A <: BaseTrait[A]] { this: A => def someMethod[B](f: A => T[B]): T[B] } class Concrete extends BaseTrait[Concrete]{ def someMethod[B](f: A => T[B]): T[B] }

Now in your case your trait itself takes a type parameter, so you'll also have to work in an other type parameter, and use higher-kinded types like so: