1. A computer-implemented method for facilitating the development and execution of a software program, comprising: during runtime of the software program, obtaining a function call associated with an overloaded function and a generic type hierarchy that lacks contravariance; determining an applicability of an implementation of the overloaded function to the function call; and selecting the implementation for invocation by the function call based on the determined applicability and a partial order of implementations for the overloaded function.