为什么在这种情况下不会发生自动装箱?

时间:2013-09-08 09:33:00

标签: java arrays list autoboxing

我想知道为什么以下不会发生自动装箱:

int [] array = new int[]{1,3,6,2,-1,6};// if it had been Integer instead of int, would have worked.
List<Integer> liston = Arrays.asList(array);

为什么它不会自动进行自动装箱有什么特别的原因?

提前致谢。

2 个答案:

答案 0 :(得分:3)

您可以阅读自动装箱here

  

Autoboxing是Java编译器自动转换   原始类型与其对应的对象包装器之间   类。例如,将int转换为Integer,将double转换为a   双,等等。如果转换是另一种方式,那就是   称为拆箱。

正如你可以在最后看到的那样,自动装箱的类型是:boolean,byte,char,float,int,long和short。 数组未自动装箱

编译器会这样做似乎很合乎逻辑,但这种行为非常复杂,需要一个非常复杂的编译器。

答案 1 :(得分:0)

为什么这里需要自动装箱?

  • Array.asList的参数是varargs T...,可以解释为T[]
  • 泛型需要对象类型,

如果您通过Integer[],则T中的T[]将被理解为Integer,因此Array.asList将返回List<Integer>
但是如果传递数组(并且所有数组也是对象类型),则T可以(并且将)int[]生成Array.asList List<int[]>的结果。

演示。

int[] array = new int[]{1,3,6,2,-1,6};
//                        |
//                        +-----------------------+
List<int[]> liston = Arrays.asList(array);//      |
System.out.println(liston.get(0)[1]);//will print 3