Oi Daniel, tudo bem?
Não foi necessário fazer o cast do tipo Conta no laço, pois a variável oRef está referenciando um objeto do tipo Object, a classe mãe de todas as outras classes:
for(int i = 0; i < lista.size();i++) {
Object oRef = lista.get(i);
System.out.println(oRef);
}
Isso quer dizer que não há a necessidade de fazer o cast, pois o lista.get(i) está pegando a referência de um objeto dentro da lista, porém todos os elementos que estão dentro dela são "convertidos" para o tipo Object quando são inseridos na ArrayList. Por isso não foi necessário fazer o cast, Object já é o tipo mais genérico do Java, qualquer outra classe seria considerado mais específico que ela, principalmente nesse caso onde as referências que estão dentro da lista são do tipo genérico Object também.
Sabendo disso, fica mais fácil de entender o porquê da necessidade de fazer o cast do tipo Conta:
Conta ref = (Conta) lista.get(0);
System.out.println(ref.getNumero());
Sabemos que o lista.get(0) acima está retornando uma referência do tipo Object, mas o Java não faz conversões do tipo mais genérico para o mais específico automaticamente (e sem reclamar), ou seja, apenas fazendo o cast estamos garantindo ao Java, que essa conversão irá funcionar. Em outras palavras, quando fazemos o Conta ref = (Conta) lista.get(0);
estamos dizendo ao Java: "Pode ficar tranquilo que, embora a lista esteja retornando um Object, eu garanto que por baixo dos panos, ele ainda é uma Conta e tudo vai funcionar".
Espero ter ajudado. Mas se ficou qualquer dúvida ou tenha algum ponto que ainda não tenha ficado claro, é só avisar!
Bons estudos!!