Downcasting

6 respostas
marciolx

porque o código abaixo gera um RuntimeException (ClassCastException)? Em que condições o downcasting de referências é permitido? alguém pode dar um exemplo?

class Base {}
class Sub extends Base {}
public class TDownc{ 
	public static void main(String argv[]){ 
		Base b=new Base(); 
		Sub s=(Sub) b; 
	}
}

6 Respostas

ricardolecheta

isto foi discutido em http://www.guj.com.br/forum/viewtopic.php?t=1936&highlight=cast… veja se lhe ajuda

marciolx

perfeito!, obrigado

Erico

O cast tem que ser analisado em dois tempos : 1 compilação , 2 execução. No tempo de compilação o exemplo não dá problema porque
uma classe é superclasse da outra. E existe a tentativa de converter a superclasse para a subclasse, assim sendo é obrigatório o cast explícito.

Quando analisado o tempo de execução, o cast só é possível se estiver convertendo uma classe que já seja do tipo da superclasse.

class Base {} 
class Sub extends Base {} 
public class TDownc{ 
   public static void main(String argv[]){ 
      Sub s = new Sub();
      Base b=s; 
      Sub z=(Sub) b; 
   } 
}

Lembre-se que em java trabalha-se com as referências de objetos e não diretamente com os objetos. :wink:

marciolx

Estou tentando encontrar uma “regra de ouro” para não esquecer mais, neste caso:

Sub s = new Sub();

Base b=s;

Sub z=(Sub) b;

b referencia o mesmo objeto de s que é uma instância de Sub assim o downcasting para na terceira linha não dá erro porque afinal de contas a referência b aponta para um objeto Sub.

no caso:

Base b=new Base();
Sub s=(Sub) b;

b referencia um objeto que é uma instância de Base, e uma referência de Sub não pode “apontar” para um objeto do tipo Base, apenas objeto do tipo Sub, por isso o ClassCastException

Certo?

Erico

É isso mesmo !

Não existe nehuma objeção em tentar converte a classe sub em classe sub. Afinal a referência da classe base é a mesma da classe sub. Note que só existe um objeto e três referências.

no caso acima em tempo de compilação satisfaz a regra :

  1. uma classe extend a outra.
    2 É feito um cast explícito da classe pai para a classe filho.

Já em tempo de execução você não pode tentar converter uma classe base em uma classe sub. Só para uma classe do mesmo tipo.

marciolx

ok, entendido

Criado 27 de maio de 2003
Ultima resposta 27 de mai. de 2003
Respostas 6
Participantes 3