收集和LT;?>是未知类型参数的集合。
就调用者而言,两者之间没有区别
void printCollection(Collection> c) { ... }
和
void printCollection(Collection c) { ... }
但是,后者允许实现引用集合的类型参数,因此通常是首选。
之前的语法存在是因为并不总是可以在适当的范围内引入类型参数。例如,考虑:
List> sets = new ArrayList<>();
sets.add(new HashSet());
sets.add(new HashSet());
如果我要更换?通过某种类型参数T,集合中的所有集合将被限制为相同的组件类型,即我不能再将具有不同元素类型的集合放入同一列表中,如以下尝试所证明的:
class C {
List> sets = new ArrayList<>();
public C() {
sets.add(new HashSet()); // does not compile
sets.add(new HashSet()); // does not compile
}
}