有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么整数的自动装箱和取消装箱不适用于数组。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的一个例子。但是它在我在{}中所做的{}中失败了

为什么会失败,为什么会选择设计实现


共 (3) 个答案

  1. # 1 楼答案

    要使事情顺利进行,您需要使用Integer[]而不是int[]

    asList的参数是类型T...,泛型类型T不能表示基元类型int,因此它将表示最特定的对象类,在本例中是数组类型int[]
    这就是为什么Arrays.asList(arrs);会尝试返回List<int[]>,而不是List<int>甚至List<Integer>

    有些人期望从int[]Integer[]的自动转换,但不要忘记,自动装箱仅适用于基本类型,而数组不是基本类型

  2. # 2 楼答案

    Arrays.asList将泛型T[]作为参数。这个T始终是一个对象,而不是一个原语。当您将int[]作为参数(不是对象数组而是原语)时,它会认为参数实际上是vararg的第一个元素。因此,结果列表将具有指纹List<int[]>

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

  3. # 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);