don't fall back to object, use non-generic return type as upper bound