解释List<? extends Number>和List<? super Integer>的涵义
时间: 2024-06-14 11:03:37 浏览: 15
List<? extends Number> 表示一个元素类型是 Number 或其子类的列表,即可以是 Integer、Double、Float 等类型的列表。这种类型的列表可以用于读取元素,但不能用于添加元素,因为我们无法确定添加的元素类型是否符合列表的类型要求。
List<? super Integer> 表示一个元素类型是 Integer 或其父类的列表,即可以是 Integer、Number、Object 等类型的列表。这种类型的列表可以用于添加 Integer 类型的元素,但不能用于读取元素,因为我们无法确定读取的元素类型是否是 Integer 类型。
下面是两个例子:
```java
List<? extends Number> list1 = new ArrayList<Integer>();
Number num1 = list1.get(0); // 可以读取元素
List<? super Integer> list2 = new ArrayList<Number>();
list2.add(1); // 可以添加 Integer 类型的元素
Integer num2 = list2.get(0); // 编译错误,无法确定读取的元素类型是否是 Integer 类型
```
相关问题
List<? extends T>
List<? extends T> 是 Java 中的一种泛型语法,表示一个类型为 T 或 T 的子类的列表。这里的问号代表通配符,extends 关键字表示上界,即表示该列表中的元素类型必须是 T 类型或 T 的子类。
这种语法的好处是可以让代码更加灵活,可以在方法参数或返回值中使用 List<? extends T>,这样就可以接受 T 或 T 的子类的列表作为参数,或者返回 T 或 T 的子类的列表作为结果,避免了在不同场景下使用不同的列表类型。
需要注意的是,List<? extends T> 是不能添加元素的,因为无法确定通配符代表的具体类型,无法保证添加的元素类型与列表元素类型相同,会导致编译错误。但是可以使用 get() 方法获取列表中的元素,因为可以确定获取的元素类型一定是 T 或 T 的子类。
java <? extends T> 和 <? super T> 详细说明,用法,举例代码
在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>`用于限定泛型的下界,可以写入泛型对象,但读取时需要进行类型转换。
使用通配符的目的是为了增加泛型的灵活性,在不确定具体类型的情况下,能够处理更广泛的数据类型。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)