Java通配符?提升泛型灵活性,分无界(?)、上界(? extends T)和下界(? super T);遵循PECS原则:生产用extends,消费用super,避免同时读写。
Java中的通配符主要用于泛型方法的参数中,用来增强代码的灵活性和
可重用性。通配符用?表示,可以配合extends和super关键字使用,分别限定上界和下界。
通配符有三种常见形式:
当你只关心集合的操作而不涉及具体元素类型时,可以使用?。例如,打印一个列表的所有元素:
这里不能向list中添加除null以外的任何元素,因为类型未知,但可以安全地读取元素并当作Object处理。
适用于需要从泛型结构中“读取”数据的场景。例如,计算一个数字列表的总和:
public double sum(java.util.List extends Number> numbers) {这个方法可以接收List、List等,只要它们是Number的子类。但不能往里面添加Integer或Double,因为实际类型不确定。
适用于需要向泛型结构中“写入”数据的场景。例如,将一组整数添加到一个可以容纳Integer及其父类型的列表中:
这个方法可以接收List、List、List等。你可以安全地添加Integer对象,但从中读取的元素只能当作Object使用。
这是使用通配符的重要指导原则:
? extends T。? super T。例如,Java集合框架中的Collections.copy()方法就遵循这一原则:
从src读取(生产者 → extends),向dest写入(消费者 → super)。
基本上就这些。通配符让泛型更灵活,但也要注意“不能同时读写”的限制,合理使用才能写出安全又通用的代码。