Downcasting

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; 
	}
}

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

perfeito!, obrigado

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:

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?

É 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.

ok, entendido