We present a design to add generic types and methods to the Java programming language. These are both explained and implemented by translation into the unextended language. In fact, there are two such translations: the homogeneous translation maps type variables to a uniform representation, while the heterogeneous translation expands the program by specializing parameterized classes according to their arguments. This talk describes both translations in detail, compares their time and space requirements and discusses how each affects the Java security model.