怎样理解下面这段代码

2021-03-25 15:22:43 +08:00
 szuwl
List<? extends Number> arr = Arrays.asList(1,2,3.1f,4.1d);

问题在于,list 变量并没有准确的类型,初始化的参数的类型也是不确定的,这样的不明确的代码为什么可以通过编译。

3900 次点击
所在节点    程序员
36 条回复
sbdx
2021-03-25 15:40:30 +08:00
编译器猜的
Jooooooooo
2021-03-25 15:51:13 +08:00
不都是 Number 吗?

List 可以装 Number.
faust24601
2021-03-25 15:54:48 +08:00
范型协变
xx6412223
2021-03-25 15:59:15 +08:00
泛型检查,泛型擦除
xuanbg
2021-03-25 16:00:05 +08:00
extends Number,就是当作 Number 类型处理啊
CodeCodeStudy
2021-03-25 16:00:45 +08:00
List 里面装的是 Number,1,2,3.1f,4.1d 这些都是 Number
szuwl
2021-03-25 16:08:11 +08:00
@CodeCodeStudy @xuanbg @Jooooooooo 这个 `list` 既然装的都是 `Number` 那为什么不允许再插入一个 `Number` 进去, `list.add(Integer.valueOf(1))` 将无法通过编译
Chengx
2021-03-25 16:09:15 +08:00
@szuwl Arrays.asList 不可修改
Chengx
2021-03-25 16:09:52 +08:00
@Chengx
Arrays.asList 返回长度固定的 List
支持 set 修改元素值
不支持 add, remove, clear
hello2060
2021-03-25 16:11:07 +08:00
实际类型就是 Number 啊,所以这语句没问题。
X26U68jE5Q6D0ih0
2021-03-25 16:16:44 +08:00
返回的是 Arrays 的内部类 ArrayList, 所以不能 add,remove,clear
szuwl
2021-03-25 16:17:06 +08:00
@Chengx 首先产生的是编译期错误 `Required type: capture of ? extends Number,Provided: Integer`,而非运行时错误,你说的是运行时错误,再另说。
szuwl
2021-03-25 16:18:51 +08:00
@Chengx @wunaidouzi
```java
List<Number> arr = Arrays.asList(1,2,3.1f,4.1d);
arr.add(Integer.valueOf(1));
```
不会有编译器错误,只是在运行时候才会出现 `UnsupportedOperationException` 异常
xuanbg
2021-03-25 16:25:17 +08:00
@szuwl 运行时不是 List<Number>,而是 Arrays.asList(1,2,3.1f,4.1d)。这个对象不允许增减操作。
llej
2021-03-25 16:27:05 +08:00
szuwl
2021-03-25 16:30:12 +08:00
@xuanbg 那我换个表达:
```java
List<? extends Number> arr = new ArrayList<Number>(){{ add(1); }};
arr.add(1); //Required type: capture of ? extends Number,Provided: int
```
这个 ArrayList 可以增减吧,但是第二句依然无法通过编译。
kuko126
2021-03-25 16:32:57 +08:00
List<? super Number> arr = Arrays.asList(1,2,3.1f,4.1d);
arr.add(Integer.valueOf(1));
不会编译错误
ipwx
2021-03-25 16:35:43 +08:00
@szuwl int != Integer
szuwl
2021-03-25 16:35:58 +08:00
@kuko126 问的是 extends 并非 super
Jwyt
2021-03-25 16:36:46 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/765041

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX