Java泛型的通配符?
(问号)是一种特殊的类型参数,用于表示未知的类型。通配符可以在使用泛型类型时提高代码的灵活性,使得一个泛型容器能够引用多种不同类型的泛型对象。主要有三种类型的通配符使用场景:无界通配符、有界通配符(上界和下界)。
1. 无界通配符(?
)
无界通配符?
表示任意类型,它的主要用途是在读取或操作集合时,表示你不关心集合中元素的具体类型。
示例
java
public void printList(List<?> list) {
for (Object item : list) {
System.out.println(item);
}
}
这里的List<?>
表示一个未知类型元素的列表,printList
方法可以接受任何类型的List
对象。
2. 有界通配符
有界通配符限制了未知类型的范围,包括上界通配符(? extends Type
)和下界通配符(? super Type
)。
上界通配符(? extends Type
)
上界通配符? extends Type
表示类型的上限,它意味着任何继承自Type
的类型都可以被接受。
java
public void printNumbers(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
这里的List<? extends Number>
可以接受List<Integer>
、List<Double>
等任何Number
子类的列表。
下界通配符(? super Type
)
下界通配符? super Type
表示类型的下限,它允许列表引用Type
类型或任何Type
的父类型。
java
public void addNumbers(List<? super Integer> list) {
list.add(10); // 可以添加Integer或其子类的实例
}
这里的List<? super Integer>
可以是List<Integer>
、List<Number>
或List<Object>
等。
通配符的使用原则
- 如果你需要从集合中读取类型
T
的数据,并且不能写入,可以使用? extends T
(生产者)。 - 如果你需要向集合中写入类型
T
的数据,并且不需要读取,可以使用? super T
(消费者)。 - 如果既不需要读取也不需要写入,可以使用无界通配符
?
。