Casting de referências [RESOLVIDO]

8 respostas
diogojhony2012

Bom noite pessoal sou iniciante em java e estou com duvidas no exercicio 10 de Casting de referências
da apostila fj11 da Caelum ele me pede o seguite:

10) (opcional) Crie a classe GuardadorDeObjetos como visto nesse capítulo. Crie uma classe TestaGuardador e dentro do main crie uma ContaCorrente e adicione-a em um GuardadorDeObjetos. Depois teste pegar essa referência como ContaPoupanca, usando casting. Repare na exception que é lançada:
GuardadorDeObjetos guardador = new GuardadorDeObjetos();
ContaCorrente cc = new ContaCorrente();
guardador.adicionaObjeto(cc);
// vai precisar do casting para compilar!
// use Ctrl+1 para o Eclipse gerar para você
ContaPoupanca cp = guardador.pega(0);
Minha Classe GuardadorDeObjeto ficou assim:
public class GuardadorDeObjetos
{
	private Object[] arrayDeObjetos = new Object[100];
	private int posicao = 0;
	
	public void adcionaObjetos(Object objetos)
	{
		this.arrayDeObjetos[this.posicao] = objetos;
		this.posicao++;
	}
	
	public Object pegaObjeto(int indice)
	{
		return this.arrayDeObjetos[indice];
	}
}
E a testa Guardador Assim:
public class TestaGuardador
{
	public static void main(String[] args)
	{
		GuardadorDeObjetos guardador = new GuardadorDeObjetos();
		
		ContaCorrente cc = new ContaCorrente();
		cc.setSaldo(100.02);
		guardador.adcionaObjetos(cc);
		
		Object objeto = guardador.pegaObjeto(0);
		ContaPoupanca cp = (ContaPoupanca) objeto;
	}
}
Mais na compilação me retorna a seguinte exeption:
Exception in thread "main" java.lang.ClassCastException: br.com.empresa.banco.conta.ContaCorrente cannot be cast to br.com.empresa.banco.conta.ContaPoupanca
 :lol: at TestaGuardador.main(TestaGuardador.java:27)

8 Respostas

cido18

Olá diogojhony2012,

Você está tentando fazer um cast ContaCorrente para ContaPoupança???

diogojhony2012

cido18:
Olá diogojhony2012,

Você está tentando fazer um cast ContaCorrente para ContaPoupança???

Isso mesmo cido18
Mai occoreu um valcilo meu aqui…O Exeption que havia passado é em execução e não em compilação…e pelo que foi passado no exercício iria ocorrer mesmo, mais aproveitando o tópico gostaria de saber se possível o porque de ter acontecer esse Exeption em execução?

cido18

Então, o problema é que as duas classes não tem nada em comum(não fazem parte da hierarquia de herança), acredito que tenha uma classe pai chamada conta não??? tenta trocar a conta poupança por conta, só para ver o resultado.

ErickRAR

Um situação mais fácil de imaginar

Você tem Gato e Cachorro, que são animais.

public abstract class Animal{}
public  class Cachorro extends Animal{}
public  class Gato extends Animal{}

Você não conseguirá transformar um gato em um cachorro, então o cast dará erro. Gato não é um cachorro e nunca conseguirá ser um. Pode latir o quanto quiser,mas sempre será um gato.

Animal gatinho = new Gato();
Cachorro catDog = (Cachorro)gatinho; //erro feio

Para você conseguir fazer um cast com segurança, existe o instanceof.

Animal garfield = new Gato();
Animal [] animais = new Anima[3];

animais[0] = garfield;

Gato gato;
    if( animais[0] instanceof Gato)
      gato =  (Gato)animais[0];

Assim não há como errar. Só haverá cast se o objeto que está em animais[0] for uma instancia de Gato.

cido18

Exelente exemplo ErickRAR, tava pensando como explicar isso XD

diogojhony2012

Sim tem uma classe pai Conta e fazendo a troca de ContaPoupanca para Conta ele executa normalmente… valew pela ajuda ai e desculpe o vacilo meu…

diogojhony2012

Vlw ErickRAR o exemplo passado deu para esclarecer bem aqui minha duvida…

cido18

Que isso o forum é para isso mesmo, se não tiver nenhuma outra dúvida não esquece de colocar o tópico como respondido :smiley:

Criado 19 de julho de 2012
Ultima resposta 19 de jul. de 2012
Respostas 8
Participantes 3