The book Java Generics and Collections (O’Reilly 2007) by Maurice Naftalin and Philip Wadler provides a grand tour of generics as available within Java. class Value<E> { E value; Value(E value) { this.value = value; } E get () { return value; } void accept(E other) { System.out.println(other); } public static void main(String[] args) { Value<Number> numVal = new Value(1); Value<Integer> intVal = new Value(2); Value<Integer> intVal2 = new Value(3); // compile error // numVal = intVal; // compile error // process1(numVal, intVal); process1(intVal, intVal2); process2(numVal, intVal); process3(numVal, intVal); process4(numVal, intVal); Value<?