GJ: the Java programming language with type parameters (1998)

by Gilad Bracha, Martin Odersky, David Stoutamire, Philip Wadler