怎样理解下面这段代码

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

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

3705 次点击
所在节点    程序员
36 条回复
misdake
2021-03-25 16:36:55 +08:00
学一下“协变”
kuko126
2021-03-25 17:01:32 +08:00
xuanbg
2021-03-25 17:25:55 +08:00
@szuwl 'add(capture<? extends java.lang.Number>)' in 'java.util.List' cannot be applied to '(int)'
richardxxx
2021-03-25 18:22:34 +08:00
extends 能取不能存
super 能存不能取
CodeCodeStudy
2021-03-25 19:07:53 +08:00
改成 ArrayList<? super Number> arr 就可以了
AoEiuV020
2021-03-25 19:20:30 +08:00
List<? extends Number> arr = Arrays.asList(1,2,3.1f,4.1d);
List<? extends Number> arr = new ArrayList(Arrays.asList(1,2,3.1f,4.1d));
理解一下这两个的区别,
AoEiuV020
2021-03-25 19:24:00 +08:00
搞错,是 extends 和 super 的区别,看来我也不熟,
uselessVisitor
2021-03-25 22:54:24 +08:00
1 不是包装类的子类吧,默认是 int 类型
@szuwl
uselessVisitor
2021-03-25 22:56:50 +08:00
@beichenhpy 我理解错了,应该是 super 。。
uselessVisitor
2021-03-25 23:57:19 +08:00
逆变不能 get 吗?
List<? super Integer> listSuper = new ArrayList<Number>();
listSuper.add(1);
System.out.println(listSuper.get(0));
我试了一下编译通过了,也没有错误啊。。
Chengx
2021-03-26 09:17:37 +08:00
@richardxxx 点睛之笔
geminius2333
2021-03-26 10:16:47 +08:00
Array.asList 方法返回的是 Arrays 的内部类。你要 add 可以 new ArrayList(Arrays.asList(...));
no1xsyzy
2021-03-26 10:26:32 +08:00
@beichenhpy 你不能 Integer x = listSuper.get(0)
println 允许的范围大得多罢了,super 仍然潜在蕴含了 extends Object
Bronya
2021-03-26 10:33:27 +08:00
本人拙见:
初始化的时候已经确定了值都是 Number,因此允许初始化。
但是添加的时候,`List<? extend Number>`并不知道到引用的哪一个子类,规定上界之后`List<? extend Number> = List<Integer> 和 List<? extend Number> = List<Double>`都是成立的,如果可以添加的话会造成`List<Integer>中添加了 Double 类型`,类似这样的代码:

```
List<Integer> intList = new ArrayList<>();
List<? extends Number> numList = intList;
numList.add(0.1);//如果允许添加
Integer integer = intList.get(0);//会造成 intList 存储了 Double
```

因此规定上界(协变?)的时候能取不能存。
super 同理。
acr0ss
2021-03-26 14:24:43 +08:00
List<? extends/ super T> 这个也曾困扰我,目前我的理解是。

1. List<? extends/ super T> 而不是 List<T>,目的就是限定只能 add/get
2. ? extends T 这种形式,因为父类无法强转为子类,但子类可以强转为父类;在只有明确上界 T 的 i 情况下,无法 add,只能 get 。
w4ngzhen
2021-03-26 14:46:27 +08:00

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

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

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

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

© 2021 V2EX