Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Autoboxing de primitivos e uso da classe Arrays.asList

Olá! Estive assistindo uma aula recentemente e passei pelo tópico sobre tipos de dados primitivos, wrappers, e a questão de passar dados primitivos para listas. Aprendi que mesmo que uma variável do tipo primitivo seja passada no método add() de uma lista, o compilador do Java realiza o Autoboxing, transformando o tipo primitivo em wrapper. Porém, eu acabei lembrando da classe Arrays e do seu método estático asList(), em que pega os dados de um array e transforma em uma lista. Caso houvesse um array de tipos primitivos e eu usasse esse método da classe Arrays, ao criar uma lista, o compilador também vai realizar um Autoboxing para transformar os tipos primitivos do array em wrappers?

1 resposta
solução!

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