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