Alguém me explica isso

Bem, a idéia é percorrer uma lista de forma recursiva executando a ação depois de percorrer a lista, a vantagem é que vc não precisa criar um lista tempória e nem mudar os elementos de lugar para percorrer a lista em ordem inversa…a idéia eu entendi, o que eu não entendi foi o código:

Collection<? extends Object> colecao

a implementação completa da recursão

public void imprimeInvertido(Collection<? extends Object> colecao) {
  imprimeInvertido(colecao.iterator());
}

private void imprimeInvertido(Iterator<? extends Object> iterator) {
  if (iterator.hasNext()) {
    Object object = iterator.next();
    imprimeInvertido(iterator);
    System.out.println(object);
  }
}

ps: foi tirado do blog do caelum, mas fiquei com receio de perguntar isso por lá… :oops:

 Collection<? extends Object> colecao

Aceite qualquer classe que extenda Object!

Não sei se entendi bem a sua dúvida, vejamos se posso te ajudar:

a declaração que utiliza o tipo genérico é para que qualquer lista que seja derivada de Collection possa utilizar este recurso.

Collection<? extends Object> colecao

Com relação a chamada do método, você pode observar que é uma sobrecarga e que a VM irá decidir por um outro de acordo com o tipo do parametro passado.

então o primeiro método recebe a coleção e chama o outro método com o mesmo nome passando um objeto iterator.

o Segundo método é recursivo, então o primeiro elemento relacionado a recursividade é a pilha. E é por isso que a impressão sai em ordem inversa, entenda a lógica:

considere uma coleção com três elementos nesta ordem: A B C

o método é chamado com a posição do iterator (beforeFirst)
verifica que tem mais (V)
pega o próximo objeto (A) e guarda em uma referência local
chama o mesmo método passando o iterator (posicionado em A)
verifica que tem mais (V)
pega o próximo objeto (B) e guarda em uma referência local
chama o mesmo método passando o iterator (posicionado em B)
verifica que tem mais (V)
pega o próximo objeto © e guarda em uma referência local
chama o mesmo método passando o iterator (posicionado em C)
verifica que tem mais (F)
retorna
mostra C
retorna
mostra B
retorna
mostra A
retorna

Resolveu a sua dúvida?

[quote=Dieval Guizelini]Não sei se entendi bem a sua dúvida, vejamos se posso te ajudar:

a declaração que utiliza o tipo genérico é para que qualquer lista que seja derivada de Collection possa utilizar este recurso.

Collection<? extends Object> colecao

Com relação a chamada do método, você pode observar que é uma sobrecarga e que a VM irá decidir por um outro de acordo com o tipo do parametro passado.

então o primeiro método recebe a coleção e chama o outro método com o mesmo nome passando um objeto iterator.

o Segundo método é recursivo, então o primeiro elemento relacionado a recursividade é a pilha. E é por isso que a impressão sai em ordem inversa…

Resolveu a sua dúvida?
[/quote]

Só isso já bastava, muito mais do que resolvido…esse é o verdadeiro post cinco estrelas :wink: