Casting de referências [RESOLVIDO]

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:

  1. (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:

[code]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];
}

}[/code]
E a testa Guardador Assim:

[code]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;
}

}[/code]
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)

Olá diogojhony2012,

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

[quote=cido18]Olá diogojhony2012,

Você está tentando fazer um cast ContaCorrente para ContaPoupança??? [/quote]

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?

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.

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.

Exelente exemplo ErickRAR, tava pensando como explicar isso XD

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…

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

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: