Duvida sobre castdown

8 respostas
M

Isto compila ok

class Animal {}

class Dog extends Animal {}

class DogTest {

	public static void main(String... args) {
	
		Animal animal = new Animal();
		Dog d = (Dog) animal;
	}

}

Mas porque ao executar, ocorre esta exception:

E:\_Java\Certificacao>java DogTest
Exception in thread "main" java.lang.ClassCastException: Animal cannot be cast to Dog
        at DogTest.main(DogTest.java:10)

8 Respostas

J

Você não pode dar um cast de um Animal pra Dog nesse caso, pq vc criou um Animal, e não um Dog.
seria assim…

Animal animal = new Dog();
Dog dog = (Dog) animal;

[]'s

ViniGodoy

E é também por isso que dizemos que cast é uma operação insegura. E que deve ser evitado a todo custo. O compilador é incapaz de verificar em tempo de compilação se seu cast está certo ou errado. No seu exemplo, bastante trivial, fica bastante óbvio que o cast está errado. Mas em um exemplo mais complexo, poderia ser difícil de determinar. Veja:

public void fazAlgoComAnimal(Animal animal) {
   Dog dog = (Dog) animal;
   dog.latir();
}


public static void main(String[] args) {
    Animal animal = AnimalDao().carregar(200);
    fazAlgoComAnimal(animal);
}

O que aconteceria se o AnimalDao carregasse um gato ao invés de um cachorro?

M

Então na prova devo assumir que castdown não funciona?

B

Vai depender da instância do objeto que estiver na heap…
Neste seu exemplo não…RuntimeException…

M

breno500as:
Vai depender da instância do objeto que estiver na heap…
Neste seu exemplo não…RuntimeException…

Sem querer abusar, tem um exemplo de um castdown que não dá exception em runtime? É que isso ainda ta um pouco confuso pra mim

ViniGodoy

Considere:

public class Animal {}

public class Dog extends Animal {}

public class Chiwawa extends Dog {}

public class Gato extends Animal {}
Então se:
Animal animal = new Chiwawa();
Os seguintes casts funcionam:
Dog dog = (Dog) animal; //Ok, pq nossa variável animal guarda um Chiwawa
Chiwawa c = (Chiwawa) animal; //Ok, pq nossa variável animal guarda um Chiwawa
Chiwawa c2 = (Chiwawa) d; //Ok, pq d também guarda o Chiwawa

animal = new Gato(); //animal agora guarda um gato
dog = (Dog) animal; //ClassCastException, animal guarda um gato
Chiwawa c = (Chiwawa) animal; //ClassCastException animal guarda um gato.
B

Opa…Creio que os exemplos do Vini podem esclarecer suas dúvidas… :slight_smile:

M

Acho que entendi, vc só pode andar pra baixo (castdown dããããã), e não de lado nem pra cima

Valeu camaradas…

Criado 28 de novembro de 2009
Ultima resposta 30 de nov. de 2009
Respostas 8
Participantes 4