Collection<?>
is a collection of unknown type parameter.
As far as the caller is concerned, there is no difference between
void printCollection(Collection<?> c) { ... }
and
<T> void printCollection(Collection<T> c) { ... }
However, the latter allows the implementation to refer to the collection's type parameter and is therefore often preferred.
The former syntax exists because it is not always possible to introduce a type parameter at the proper scope. For instance, consider:
List<Set<?>> sets = new ArrayList<>();
sets.add(new HashSet<String>());
sets.add(new HashSet<Integer>());
If I were to replace ?
by some type parameter T
, all sets in sets
would be restricted to the same component type, i.e. I can no longer put sets having different element types into the same list, as evidenced by the following attempt:
class C<T extends String> {
List<Set<T>> sets = new ArrayList<>();
public C() {
sets.add(new HashSet<String>()); // does not compile
sets.add(new HashSet<Integer>()); // does not compile
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…