为什么整数的自动装箱和取消装箱不适用于数组。Java中的asList?
下面是compile error
:
int[] arrs = {1,2,4,3,5,6};
List<Integer> arry = Arrays.asList(arrs);
但这是可行的:
for (Integer i : arrs){
//do something
}
自动装箱在很多情况下都能工作,我刚才给出了上面for-loop
的一个例子。但是它在我在{
为什么会失败,为什么会选择设计实现
# 1 楼答案
要使事情顺利进行,您需要使用
Integer[]
而不是int[]
asList
的参数是类型T...
,泛型类型T
不能表示基元类型int
,因此它将表示最特定的对象类,在本例中是数组类型int[]
这就是为什么
Arrays.asList(arrs);
会尝试返回List<int[]>
,而不是List<int>
甚至List<Integer>
有些人期望从
int[]
到Integer[]
的自动转换,但不要忘记,自动装箱仅适用于基本类型,而数组不是基本类型# 2 楼答案
Arrays.asList
将泛型T[]
作为参数。这个T
始终是一个对象,而不是一个原语。当您将int[]
作为参数(不是对象数组而是原语)时,它会认为参数实际上是vararg的第一个元素。因此,结果列表将具有指纹List<int[]>
如果您想了解有关数组中泛型的更多信息,请阅读本页: http://docs.oracle.com/javase/tutorial/extra/generics/fineprint.html(部分:数组)
# 3 楼答案
Arrays.asList()
接受给定类型的任意数量的参数(#asList(T.. t)
)。调用Arrays.asList(arrs)
实际上是传递类型为int[]
的单个元素,因此出现了问题。 它应该是:int[] arrs = {1,2,4,3,5,6};
List<int[]> arry = Arrays.asList(arrs);
或
List<Integer> arry = Arrays.asList(1,2,3,4,5,6);