Olá Lucas,
O método asList recebe um varargs de um tipo genérico e devolve um List daquele tipo.
Um tipo genérico deve ser uma classe, no caso dos primitivos, o java oferece as classes wrapper e um autoboxing acontece quando passamos o primitivo por parâmetro.
Então, considere o exemplo:
List<Integer> lista = Arrays.asList(1,3,5,7,9); // devolve um List com 5 elementos do tipo Integer
Neste caso, acontecerá um autoboxing e a lista retornada será um List de Integer.
Por ser um varargs, podemos passar os parâmetros na forma de um array, por exemplo:
Integer[] array = new Integer[]{1,3,5,7,9};
List<Integer> lista = Arrays.asList(array); // devolve um List com 5 elementos do tipo Integer
Nesse código também acontece um autoboxing logo na primeira linha: Integer[] array = new Integer[]{1,3,5,9};
. Desse modo, o asList reconhece o array de Integer e devolve um List de Integer.
Agora pensando em um cenário onde eu passe um array de primitivos pro asList, podemos até esperar o mesmo comportamento:
int[] array = new int[]{1,3,5,7,9};
List<Integer> numeros = Arrays.asList(array); // não compila
Porém tomamos um erro do compilador.
Por que isso acontece?
Antes do parâmetro ser processado como um array pelo varargs, existe o processo de definição do tipo genérico do parâmetro. Nessa primeira fase, não ocorreu nenhum autoboxing. Portanto, o varargs vai processar o array como um único elemento do tipo int[].class
:
int[] array = new int[]{1,3,5,7,9};
List<int[]> numeros = Arrays.asList(array); // devolve um List com um único elemento, que é o array de inteiros ainda em sua forma primitiva
Escrevi bastante e pode ser que algo fique confuso, não se preocupe, a inferência do generics não é algo tão simples de se interpretar em alguns casos. Caso surja alguma dúvida, volte a postar.
Abs