Tanto quanto posso dizer, o motivo pode ser encontrado na parte do javadoc que você não citou (ênfase abaixo da minha):
Um iterador para listas que permite ao programador percorrer a lista em qualquer direção, modificar a lista durante a iteração ...
Veja, o objetivo pretendido é permitir o uso enquanto a lista estiver sendo modificada. As possíveis modificações aparentemente incluem a remoção dos elementos.
Agora pense no que aconteceria se removêssemos um elemento que seria current()
para o iterador - supondo que o iterador tivesse uma noção do elemento atual? Nesse contexto, a maneira de implementá-lo sem a noção de elemento atual faz muito sentido para mim - porque, dessa forma, o iterador não precisa se preocupar com a remoção de elementos.
É importante observar que o javadoc não requer que as implementações de interface sejam seguras contra threads.
- Por esse motivo, não se deve esperar o manuseio correto das modificações feitas a partir de diferentes threads - para isso, a implementação teria que fornecer meios adicionais para sincronizar o acesso, garantir visibilidade etc., conforme especificado pelo Java Memory Model por JSR 133 .
O ListIterator é capaz de lidar com modificações feitas a partir do mesmo thread durante a iteração. Nem todos os iteradores são assim, os javadocs ConcurrentModificationException alertam especificamente sobre isso:
... Observe que essa exceção nem sempre indica que um objeto foi modificado simultaneamente por um thread diferente. Se um único encadeamento emitir uma sequência de invocações de método que viole o contrato de um objeto, o objeto poderá lançar esta exceção. Por exemplo, se um encadeamento modificar uma coleção diretamente enquanto estiver iterando sobre a coleção com um iterador à prova de falhas, o iterador lançará esta exceção ...