-
? extends T
:表示某个未知类型,它是T
类型的子类(包括T
自身),也就是上界为T
。这种通配符主要用于读取数据,例如遍历列表并读取元素。由于通配符的上界是T
,(我们可以举出一个例子,假如T是Number类型,他的子类就有可能是Float或Integer,如果是Integer就无法再给他赋予Float)所以无法向其中添加任何元素,因为我们无法确定实际类型是Float还是Integer或者其他子类型。在使用时,可以将该通配符参数视为只读的。 -
? super T
:表示某个未知类型,它是T
类型的父类(包括T
自身),也就是下界为T
。这种通配符主要用于写入数据,例如向列表中添加元素。由于通配符的下界是T
,(可以把他看作是Object)所以可以向其中添加T
类型的元素,但无法确切知道列表中的元素类型。在使用时,可以将通配符参数视为只写的。
这两种通配符的使用方式是为了增强泛型的灵活性。通配符允许我们处理未知类型的数据,但在使用时需要注意保证类型安全。通常情况下,如果需要从集合中读取数据,则使用 ? extends T
;如果需要向集合中写入数据,则使用 ? super T
。