Problemas com Casting

5 respostas
Jaba

E ai pessoal, blz?

Bom, antes de tudo, eu já procurei aqui no GUJ e não encontrei nenhum tópico que sanasse todas minhas dúvidas.
Bem, estou meio incerto quanto ao funcionamento do Casting no Java, e vou mostrar o porque.

Bem, eu sei que todo UPCAST é possível, ou seja: implicita ou explicitamente, toda conversão de um SUBTIPO para um SUPERTIPO irá funcionar.
Agora, o que tá fazendo nasce Urugutango fica pendurado no meu galho é o DOWNCAST.

Vamos considerar esta Herança:

class Animal {

    public void Comer(){
        System.out.println("Comendo");
    }

}
class Cachorro extends Animal {

    public void balancandoRabo(){
        System.out.println("Balança Fio de Deus!");
    }

}

Agora temos o seguinte código:

Animal a = new Cachorro();
        Cachorro b = new Cachorro();

        b = (Cachorro)a;
        b.balancandoRabo();

Beleza, o Cast Funciona! Porque? Porque nós temos um Objeto Cachorro em uma variavel de referencia Animal, e o casting funciona!
Mas, porque quando eu faço isso:

b = a;

O código não compila?
Eu estou tentando atribuir um objeto Cachorro, numa variavel de referencia Animal, em uma variavel de Referencia Cachorro, que é a mesma coisa que eu fiz em cima, só que sem o casting.

A questão é: o compilador verifica a referencia ou o objeto? Porque nesse exemplo, ele fez os dois.

Eu sei tambem que quando você faz um Casting, ele não verifica em tempo de compilação, mas sim em tempo de Execução, mas verifica o que: a referencia ou o objeto?

Não sei aonde eu estou me perdendo, mais me ajuda ai, galera, ficou confuso...

Valew!

5 Respostas

D

Olá Jaba,

Quando é feita a atribuição b = a, o compilador valida a REFERÊNCIA, ou seja, um Animal não cabe em um cachorro. A seguinte mensagem de erro é apresentada ao tentar compilar esse código: Type mismatch: Cannot convert from Animal to Dog.

    Sempre que a referência do operando do lado direito for uma super classe do operando do lado esquerdo, torna-se necessário fazer o casting explícito.

Espero ter ajudado,

Denis

bzy

É assim: Um Cachorro é um Animal mas um Animal não é (só) um Cachorro.

Seria o mesmo de fazer:

Entende?

andredemelo

A atribuiçõa que você está fazendo não no caso de:

O certo é você colocar assim:

Pois da maneira que você fez, você quiz dizer que:

De certa forma está certo, pois um cachorro é um animal, mais um animal não se resume somente em um cachorro e sim em vários outros.

Já na segunda maneira, que é a correta, vc está dizendo:

Desta maneira ele compilará!!

evertonsilvagomesjav

O certo é você colocar assim:

a = b;

Não tem isso de certo é colocar assim. Se ele quiser usar polimorfismo igual estava fazendo nao tem problema nenhum, e esta certo tb.

O que acontece é igual foi citado acima, um Animal nao cabe em um Cachorro, por isso o casting deve ser feito explicitamente.

Jaba

Eh verdade, confirmei essa informação aqui.

A verdade é que NUNCA uma SUPERCLASSE cabe em uma SUBCLASSE, a diferença é que o Casting só lança a exceção na execução e a atribuição implicita já lança o erro na compilação.

Valew, Galera!!!

Criado 28 de setembro de 2010
Ultima resposta 28 de set. de 2010
Respostas 5
Participantes 5