Dúvida com método asList! [RESOLVIDO]

Boa noite…

Alguém pode me explicar pq não consigo adicionar um objeto no meu List que foi retornado pelo método asList?


  String [] arrayDeStrings = {"Java", "Delphi", "C"};
  List listaDeStrings = Arrays.asList(arrayDeStrings);
  listaDeStrings.add(".Net"); 
   //exceção de tempo de execução! <<java.lang.UnsupportedOperationException>>
  

Será que não consigo pq tô tentando adicionar .Net ao array? :lol:

Eu realmente não entendi.

Valeu

Opa fiquei curioso e fiz os testes, mas ao ler a documentação a minha surpresa!

Ou seja você não pode modificar a estrutura da list e sim o seu conteúdo
Abraços

Este metodo retorna um objeto do tipo da interface List, acredito que seja por isso, pois esta interface nã possui implementação para adicionar algum elemento.

String[] arrayDeStrings = {"Java", "Delphi", "C"}; List<String> listaDeStrings = Arrays.asList(arrayDeStrings); ArrayList<String> list = new ArrayList<String>(listaDeStrings); list.add(".Net"); for (String string : list) { System.out.println(string); }

Desta maneira funcionou, acredito que seja porque o ArrayList possui implementação para o metodo de adicionar. Corrigam-me se estiver errado…

Att.

[quote=71C4700]Este metodo retorna um objeto do tipo da interface List, acredito que seja por isso, pois esta interface nã possui implementação para adicionar algum elemento.

String[] arrayDeStrings = {"Java", "Delphi", "C"}; List<String> listaDeStrings = Arrays.asList(arrayDeStrings); ArrayList<String> list = new ArrayList<String>(listaDeStrings); list.add(".Net"); for (String string : list) { System.out.println(string); }

Desta maneira funcionou, acredito que seja porque o ArrayList possui implementação para o metodo de adicionar. Corrigam-me se estiver errado…

Att.[/quote]

Cara, eu fiz teste aqui também.
Deste jeito funcionou, mas ocorreu que a lista e o array agora ficaram independentes. Ou seja, se modificar um o outro não é alterado.

A minha preocupação é que no livro da Kathy não fala nada sobre isto. Será que uma questão desse tipo pode pintar na prova?

Obrigado pelas respostas!

Acho que consegui entender…

Quando usamos o método asList para alimentar uma Lista através do array, tanto a lista quanto o array ficam ligados. Não sei, mas acredito que referênciam o mesmo objeto.
Como o array não é uma estrutura dinâmica, não podemos dar um lista.add(novoElemento), pois isto alteraria a estrutura do array.

Eu cheguei a esta conclusão quando fui utilizar o método List.toArray();

 List<String> lista = new ArrayList<String>();
 lista.add("Corinthians");  lista.add("Campeão Brasileiro 2009");
 String [] arrayDeString = new String[3];
 arrayDeString = lista.toArray(arrayDeString);

Neste caso, o método List.toArray(), tanto array quanto lista ficam independentes

 arrayDeString[1] = "Campeão da Libertadore 2010"; //Não altera a lista
 lista.add("Campeão do Mundo 2010"); //Ok, não dá erro algum pois não altera o array

Resumindo pelo que entendi:

O método Arrays.asList(): a Lista referência o objeto Array. Não pode dar Lista.add() pois altera a estrutura do array e isso é impossível. Ocorre exceção de tempo de execução.

O método List.toArray(): Lista e array são independente. Pode dar List.add() que não ocorre problema.

É isso, não sei se está correto o que eu pensei, mas desta forma eu consegui entender.

Obrigado.

Somente acrescentando, um exemplo para demonstrar que o array e o List ‘apontam’ para o mesmo objeto.

String[] arrayDeStrings = new String[4];
        arrayDeStrings[0] = "Java";
        arrayDeStrings[1] = "C";
        arrayDeStrings[2] = "Scala";
        List<String> listaDeStrings = Arrays.asList(arrayDeStrings);
        System.out.println("Antes de inserir na última posição");
        for (String string : listaDeStrings) {
            System.out.println(string);
        }
        arrayDeStrings[3] = ".Net";
        System.out.println("Depois da inserção");
        for (String string : listaDeStrings) {
            System.out.println(string);
        }

At…

Isso mesmo!!!

Obrigado.

[quote=71C4700]Este metodo retorna um objeto do tipo da interface List, acredito que seja por isso, pois esta interface nã possui implementação para adicionar algum elemento.

String[] arrayDeStrings = {"Java", "Delphi", "C"}; List<String> listaDeStrings = Arrays.asList(arrayDeStrings); ArrayList<String> list = new ArrayList<String>(listaDeStrings); list.add(".Net"); for (String string : list) { System.out.println(string); }

Desta maneira funcionou, acredito que seja porque o ArrayList possui implementação para o metodo de adicionar. Corrigam-me se estiver errado…

Att.[/quote]

Não cara, o raciocínio não é esse, esse método retorna alguma implementação de List, no caso se você olhar a implementação do método ele retorna um ArayList.