You could say s is bounded from below by non empty and from above by IntSet And that would then restrict any actual argument for s to a type that's in the interval between non empty and IntSet In our case, that interval actually contains only the two types, non-empty and IntSet because we have this inheritance relationship. 