Java Generics and Collections

4.1. Constructors

In 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.

Категории