Olá Luis, tudo bem!?
O java possui uma API( um conjunto de classes e interfaces ) para trabalhar com coleções. Nesta API, há implementações(Classes) prontas para resolver problemas que envolvam coleções. Por exemplo:
Caso você precise trabalhar com um Array de Conta ou de qualquer outro tipo de classe, você não precisa mais ter todo o árduo trabalho de se preocupar com a implementação de um Array para Conta. Você pode fazer uso de uma classe ArrayList, por exemplo, que implementa a interface List. Ou seja, um ArrayList, implementa todos os métodos declarados na Interface List. O "contrato" é assinado e, logo, você tem a garantia de que seu ArrayList é um List.
Caso você precise de mais performance, na inserção, por exemplo, você pode mudar a implementação do ArrayList para outra.
Veja o seguinte:
ArrayList<Conta> numeros = new ArrayList<Conta>();
No caso acima, eu estou dizendo que minha coleção de números é to dipo ArrayList de Conta... Caso eu precisasse mudar minha implementação, não conseguiria. Neste caso, há um certo acoplamento entre a declaração do tipo e implementação. No entanto, veja de outra forma:
List<Conta> contas;
contas = new ArrayList<Conta>();
contas = new LinkedList<Conta>();
No caso acima, eu disse que possuo contas do tipo List, certo? Sendo assim, qualquer um que "É UM" List, pode ter sua referência atribuída a contas.
Acredito que nesse exercício, seja usado todos os métodos declarados em List. Então, fica mais fácil de mudar a implementação, caso precise, programando voltado à interface:
List<Conta> contas = new ArrayList<Conta>();
//ou
List<Conta> contas = new LinkedList<Conta>();
do que voltado à implementação:
ArrayList<Conta> contas = new ArrayList<Conta>();
//ou
LinkedList<Conta> contas = new LinkedList<Conta>();
Este é apenas um exemplo de programar voltado à interface. Isto pode ser bastante utilizado na passagem de parâmetros dos métodos, que permite o uso do polimorsismo de referência.
Abs,
Bruno.