java <? extends T> 和 <? super T> 详细说明,用法,举例代码
时间: 2023-08-19 15:04:17 浏览: 137
在Java的泛型中,`<? extends T>`和`<? super T>`是用来限定通配符(Wildcard)的上界和下界。
1. `<? extends T>`:表示通配符的上界是T或T的子类。使用`<? extends T>`可以使泛型类型接受T或T的子类型作为参数,但不能用于写入对象。
```java
public void processList(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
List<Integer> integers = new ArrayList<>();
integers.add(1);
integers.add(2);
processList(integers); // 可以传递List<Integer>或List<Number>,但不能传递List<Object>
```
在上述示例中,`processList()`方法接受一个`List<? extends Number>`类型的参数,这意味着可以传递`List<Integer>`或`List<Number>`作为参数。在方法内部,我们可以从list中读取Number类型的元素,因为Number是Integer的父类。
2. `<? super T>`:表示通配符的下界是T或T的父类。使用`<? super T>`可以使泛型类型接受T或T的父类型作为参数,并且可以用于写入对象。
```java
public void addToList(List<? super Integer> list) {
list.add(1);
list.add(2);
}
List<Number> numbers = new ArrayList<>();
numbers.add(0.5);
addToList(numbers); // 可以传递List<Integer>或List<Object>,但不能传递List<Number>
System.out.println(numbers); // 输出:[0.5, 1, 2]
```
在上述示例中,`addToList()`方法接受一个`List<? super Integer>`类型的参数,这意味着可以传递`List<Integer>`或`List<Object>`作为参数。在方法内部,我们可以向list中添加Integer类型的元素,因为Integer是Number的子类。
总结:
- `<? extends T>`用于限定泛型的上界,可以读取泛型对象,但不能写入;
- `<? super T>`用于限定泛型的下界,可以写入泛型对象,但读取时需要进行类型转换。
使用通配符的目的是为了增加泛型的灵活性,在不确定具体类型的情况下,能够处理更广泛的数据类型。
阅读全文