1. A method for generating executable code, comprising: receiving source code which has not been compiled into executable code, wherein the source code can include declarations for types and operations, wherein the type declarations may be parameterized, and wherein the source code may specify subtyping relationships between declared types; and compiling or interpreting the source code to produce executable code to be executed during runtime, wherein compiling or interpreting source code comprises including hidden type variables as type parameters that express type relationships directly and not adhering to type erasure semantics, wherein the type parameters are retained at runtime and are instantiated by different types during execution, and wherein the result of executing operations may depend upon the instantiations of the type parameters; wherein compiling or interpreting source code involves, checking prior to runtime the types and operations in the source code to ensure that the executable code generated is type-safe, and hence will not generate type errors during execution.