Consider the following Scala code:
abstract class A
abstract class B[T <: A]
class ConcreteA extends A
class ConcreteB extends B[ConcreteA]
class Example
Kipton got close with his higher-kinded solution. Unfortunately he tripped over what appears to be a bug in Scala < 2.9.1.RC1. The following works as expected with 2.9.1.RC1 and trunk,
Welcome to Scala version 2.9.1.RC1 (Java HotSpot(TM) Server VM, Java 1.7.0).
Type in expressions to have them evaluated.
Type :help for more information.
scala> abstract class A
defined class A
scala> abstract class B[T <: A]
defined class B
scala> class ConcreteA extends A
defined class ConcreteA
scala> class ConcreteB[T <: A] extends B[T]
defined class ConcreteB
scala> class Example[T <: A, U[X <: A] <: B[X]](resolver: U[T])
defined class Example
scala> new Example(new ConcreteB[ConcreteA])
res0: Example[ConcreteA,ConcreteB] = Example@ec48e7