解释List<? extends Number>和List<? super Integer>的涵义
时间: 2024-06-14 15:03:37 浏览: 249
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 Number> x5 = new ArrayList<Integer> ();编译会出错吗
不会。这是Java中的泛型,可以将一个 Integer 类型的 ArrayList 赋值给一个 List<? extends Number> 类型的变量。这是因为 Integer 类型是 Number 类型的一个子类。
String类并没有继承Number类为什么List<Optional<? extends Number>> list = new ArrayList<>();这段代码的元素可以是String
在Java中,String类确实没有继承Number类。但是在Java中,可以使用通配符泛型来表示某个类型或其子类型,例如使用 extends 关键字限定通配符的上界,也就是通配符可以代表的最大类型范围。因此,List<Optional<? extends Number>> 这个泛型定义中的 ? extends Number 表示元素类型可以是 Number 类型或其子类型。
当使用 Optional 类型时,可以将其类型参数指定为 ? extends Number,表示 Optional 实例可以包含 Number 类型或其子类型的值。因此,List<Optional<? extends Number>> 这个泛型定义中的 Optional 也可以包含 Number 类型或其子类型的值,包括 String 类型,因为 String 可以通过一些方法转换为 Number 类型,例如 Integer.parseInt(String)。
需要注意的是,在使用 Optional 类型时,如果 Optional 实例中包含的值不是 Number 类型或其子类型,会抛出 ClassCastException 异常。因此,在实际使用中需要进行类型判断和转换,以确保 Optional 实例中包含的值符合要求。
阅读全文