为什么在Java中,整数的自动装箱和拆箱与Arrays.asList不兼容?

4
以下内容会抛出“编译错误”:

int[] arrs = {1,2,4,3,5,6};
List<Integer> arry = Arrays.asList(arrs);

但是这个可以运行:
for (Integer i : arrs){
   //do something
}

自动装箱在许多情况下都有效,我刚才给出了一个for-loop的例子。但它在我使用Arrays.asList()创建的List-view中失败了。

为什么会失败,为什么选择这样的设计实现呢?


5
因为 int[]Integer[] 不存在自动装箱,并且该方法需要一个 T[] - Boris the Spider
3个回答

6
要使代码正常工作,需要使用Integer[]而不是int[]asList的参数类型为T...和泛型类型T无法表示基本数据类型int,因此它将表示最具体的Object类,即数组类型int[]。 因此,Arrays.asList(arrs); 将尝试返回List<int[]>而不是List<int>List<Integer>
有些人希望自动转换int[]Integer[],但别忘了自动装箱仅适用于基本数据类型,而数组不是基本数据类型。

嘿,编辑得不错,现在答案一样了 :) - Roy van Rijn

2
Arrays.asList接受泛型的T[]作为参数。这个T总是一个对象,而不是原始类型。当你传递一个int[]作为参数(不是对象数组而是原始类型),它会认为参数实际上是可变参数的第一个元素。因此,结果列表将具有指纹List<int[]>

如果您想了解有关数组中泛型的更多信息,请阅读此页面:http://docs.oracle.com/javase/tutorial/extra/generics/fineprint.html(部分:数组)。


1

Arrays.asList() 接受一个给定类型 T (#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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接