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

Dúvida no ClassCastException

Quando executo conforme o Nico faz no código, onde ele omite este código //Conta cc = new ContaCorrente(11, 22); e na sequencia cria uma conta, ok, da o mesmo erro ClassCastException, porém quando crio um novo cliente abaixo das contas, e peço para adicionar, o programa compila e ainda me traz a seguinte saída:

br.com.bytebank.banco.modelo.Cliente@15db9742

Porque isso ocorre?

package br.com.bytebank.banco.test.util;

import java.util.ArrayList;

import br.com.bytebank.banco.modelo.Cliente;
import br.com.bytebank.banco.modelo.Conta;
import br.com.bytebank.banco.modelo.ContaCorrente;
import br.com.bytebank.banco.modelo.ContaPoupanca;

public class Teste {

    public static void main(String[] args) {

        ArrayList lista = new ArrayList();

        Conta cc = new ContaCorrente(11, 22); 
        lista.add(cc);

        Conta cp = new ContaPoupanca(11, 33);
        lista.add(cp);

        Cliente cliente = new Cliente();
        lista.add(cliente);

        System.out.println(lista.size());

        Conta referencia = (Conta) lista.get(0);
3 respostas

Oi Thales, tudo bem?

Essa é a saída padrão quando tentamos printar um objeto, podemos alterar a forma como ela é apresentada no console mudando o método toString(). Repare que se visualizarmos os métodos das classes ContaCorrente e ContaPoupanca, entre eles encontraremos o método toString() sobrescrito nas duas classes:

ContaCorrente:

//Código omitido

public class ContaCorrente extends Conta implements Tributavel {

    //Código omitido

    @Override
    public String toString() {
        return "ContaCorrente, " + super.toString();
    }
}

ContaPoupanca:

//Código omitido

public class ContaPoupanca extends Conta {

    //Código omitido

    @Override
    public String toString() {
        return "ContaPoupanca, " + super.toString();
    }
}

Só relembrando, quando usamos o System.out.println(), internamente estamos chamando o método toString() e, como eu disse antes, essa sopa de letrinhas que apareceu para você é o retorno padrão do método. Portanto, precisamos sobrescrever o toString() para que, quando formos printar um objeto, ele retorne algo relevante para nós, assim como fizemos com a ContaCorrente e a ContaPoupanca algumas aulas atrás. Para isso, basta sobrescrevermos o toString() na classe Cliente também:

//Código omitido

public class Cliente  {

    //Código omitido

    @Override
        public String toString() {
            return "Cliente: " + this.nome + ", cpf: " + this.cpf;
        }
}

Em nosso caso, ele vai retornar o cliente e o cpf como null, já que nós não atribuímos nenhum valor a eles, diferente da ContaCorrente e da ContaPoupanca onde atribuímos um número e uma agência através de seus construtores.

Espero ter ajudado, qualquer dúvida é só avisar!

Bons estudos!!

Certo Thiago, essa parte do toString eu entendi e me lembro.

O que eu quis dizer com a pergunta é que ao criar uma referência do tipo Cliente, o programa deveria nos trazer um ClassCastException, porém ao criar um objeto Cliente: Cliente cliente = new Cliente(); lista.add(cliente); ele não trouxe o ClassCastException e permitiu a criação da referencia do tipo Cliente, mesmo tendo declardo: Conta referencia = (Conta) lista.get(0);

solução!

Boa noite!

Quando você definiu sua ArrayList lista = new ArrayList(); , você não informou qual o tipo de objeto que esta lista irá aceitar. Assim, tudo o que você quiser adicionar a esta lista , será aceito.

A questão do ClassCastException irá ocorrer se o objeto que você for recuperar não for adequado ao objeto que irá recebe-lo.

Assim, lista.get(0) contém um objeto que estende de (Conta), e o programa aceitará. Agora, se você tentar jogar a referência em um objeto do tipo cliente, dará o ClassCastException.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software