1. A computer-implemented method for facilitating the development and execution of a software program, comprising: obtaining a type interval for a generic type parameter of an implementation of an overloaded function; selecting an inference direction for the generic type parameter based on a variance of the generic type parameter, wherein the inference direction is an upward inference direction or a downward inference direction; and using the type interval and the inference direction to perform type inference on the generic type parameter, wherein doing so comprises: propagating one or more limits associated with the type interval through a set of constraints associated with the generic type parameter based on the inference direction; when the type interval is non-empty after the one or more limits are propagated through the set of constraints, choosing a binding for the generic type parameter based on the inference direction; and when the type interval is empty after the one or more limits are propagated through the set of constraints, determining that the implementation is not applicable to a function call associated with the overloaded function and the type interval.