4.1. ConstructorsIn a generic class, type parameters appear in the header that declares the class, but not in the constructor: class Pair<T, U> { private final T first; private final U second; public Pair(T first, U second) { this.first=first; this.second=second; } public T getFirst() { return first; } public U getSecond() { return second; } } The type parameters T and U are declared at the beginning of the class, not in the constructor. However, actual type parameters are passed to the constructor whenever it is invoked: Pair<String, Integer> pair = new Pair<String, Integer>("one",2); assert pair.getFirst().equals("one") && pair.getSecond() == 2; Look Out for This! A common mistake is to forget the type parameters when invoking the constructor: Pair<String, Integer> pair = new Pair("one",2); This mistake produces a warning, but not an error. It is taken to be legal, because Pair is treated as a raw type, but conversion from a raw type to the corresponding parameterized type generates an unchecked warning; see Section 5.3, which explains how the -Xlint:unchecked flag can help you spot errors of this kind. |