You have two options—either use the type lambda trick to partially apply Fooable
(ugh):
def getFoo[TType[_]: ({type L[A[_]] = Fooable[A, TContents]})#L, TContents](
obj: TType[TContents]
): TContents = implicitly[Fooable[TType, TContents]].foo(obj)
Or desugar the context bound (much nicer, in my opinion):
def getFoo[TType[_], TContents](obj: TType[TContents])(
implicit ev: Fooable[TType, TContents]
): TContents = ev.foo(obj)
Note that in either case you'll need to give your aFooable
a type parameter:
implicit def aFooable[A] = AFooable[A]
And I'd strongly advise obeying the warnings about parameter list-less case classes.