Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Cast type dentro do Laço For

Por favor, alguém poderia explicar porque no interior do laço não é necessário fazer o type cast para chamar um método descrito na classe "Conta".

for(int i = 0; i < lista.size();i++) {  // Use of method "size()", not a public attribute "length".
            Object oRef = lista.get(i);
            System.out.println(oRef);  // Calls the method "toString()" of class "ContaCorrente".
        }

Surgiu essa dúvida uma vez que foi necessário fazê-lo na explicação do método "get()":

Conta ref = (Conta) lista.get(0);  // Creates variable type "Conta" "ref" that refers to the method "get()" of object "lista", with cast type to be type "Conta" (calling "Conta" methods).
System.out.println(ref.getNumero());  // Can access methods of class "Conta".

Desde já agradeço explicação.

2 respostas
solução!

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!!

Muito obrigado pela resposta! Ótima explicação!