Downcast … como funciona?

Quando realizamos a conversão de uma variável de referência* que referencia um objeto do seu subtipo declarado para o seu subtipo, chamamos esta conversão de downcast. Melhor explicando … Dada a estrutura de classes abaixo:

 
 

 
 

Se declararmos um código da seguinte maneira:

 
 

1. A x = new B() // perfeitamente possível devido a relação de herança entre as duas classes

// a variável de referência ‘x’ referencia um objeto do tipo B que é do seu subtipo declarado (A x).

2. B y = (B) x // realizando o downcast

 
 

Na linha 2 somos obrigados a realizar a conversão explicita da referência* da variável ‘x’ para B para podermos atribuí-la para a variável ‘y’ que é do tipo B. Esta conversão é chamada de downcast pois estamos “convertendo para baixo na estrutura hierárquica das classes” a o conteúdo da variável ‘x’ que contém uma referência para seu sub-tipo declarado (B).

 
 

* entenda por “referência” o objeto que está no heap.

* entenda por “variável de referência” a variável que está na stack e que acessa o objeto no heap (o objeto referenciado). (veja nas figuras abaixo)

 
 

Porém nem tudo são flores …

 
 

A conversão (downcast) para uma variável só é válida quando ela possui uma referência válida para a qual ela está sendo convertida. No primeiro caso não podemos atribuir a referência da variável (ou simplesmente referencia) ‘x’ para a variável ‘y’, pois a referência de ‘x’ é do tipo A e não pode ser convertido para um objeto do tipo B. Observe que a variável ‘x’ é do tipo A e tem uma referência para A, e a variável ‘y’ é do tipo B e tem uma referência para B.

 
 

class A{}

class B extends A{}

public class Teste {

public static void main(String[] args){

A x = new A();

B y = new B();                

 
 

y = (B) x;

System.out.println(y.getClass().getName());

}

}

Output:

Exception in thread “main” java.lang.ClassCastException: A cannot be cast to B

at Teste.main(Teste.java:6)

 
 

 
 

 
 

Já no segundo caso a conversão (downcast) da referência contida na variável ‘x’, que é declarada do tipo A é possível, pois ela referencia um objeto do tipo B no heap. Isso é possível por causa da estrutura de herança (B extends A).

 
 

class A{}

class B extends A{}

public class Teste {

public static void main(String[] args){

A x = new B();

B y = new B();                

 
 

y = (B) x;

System.out.println(y.getClass().getName());

}

}

Output:

B

 
 

 
 

 
 

 
 

Anúncios
Esta entrada foi publicada em Java com as etiquetas . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s