2013-09-08 11 views
3

Я хотел бы знать, почему 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); 

Есть ли конкретная причина, почему она не Autobox автоматически?

Заранее спасибо.

ответ

3

вы можете прочитать на Autoboxing here:

Autoboxing является автоматическим преобразованием, что компилятор Java делает между примитивными типами и их соответствующим объектом оберткой классов. Например, преобразование int в Integer, double в Double и т. Д. Если преобразование идет другим путем, это называется unboxing.

и, как вы можете прочитать в конце, типы tat являются автоматическими коробками: boolean, byte, char, float, int, long и short. массив не автобоксирован

может показаться вам логичным, что компилятор сделает это, но такое поведение очень сложно и требует очень сложного компилятора.

0

Для чего нужно использовать autoboxing?

  • аргумент Array.asList является переменной длиной 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