Duvida.. Questao Testkiller

Pq lança essa exceção java.lang.ClassCastException se um Cat pode fazer tudo q um Animal pode fazer?

class Animal {
public String noise() {
return “peep”; } }

class Dog extends Animal {
public String noise() {
return “bark”; } }

class Cat extends Animal {
public String noise() {
return “meow”; } }

Animal animal = new Dog();
Cat cat = (Cat)animal;
System.out.println(cat.noise());

A questão é que Dog e cat não tem nenhuma relação.
Eles herdam de animal, mas não são a mesma coisa.

[quote=Markinhus86]Pq lança essa exceção java.lang.ClassCastException se um Cat pode fazer tudo q um Animal pode fazer?

Animal animal = new Dog();
Cat cat = (Cat)animal;
System.out.println(cat.noise());[/quote]

corroborando com o que o colega acima ja citou…

veja o que esse trecho faz…

ele cria um Dog (um cachorro, que herda de animal)
guarda o Dog em um Animal, ou seja esta usando polimorfismo, para guardar um objeto dog em um supertipo Animal…
depois ele tenta transformar o que esta dentro de “animal”, que é um Dog, em um Cat…
O programa verifica que Dog e Cat não tem relação direta um com o outro, e gera uma exceção, avisando que é impossivel transformar
Um Cachorro em um Gato, mesmo os 2 sendo animais, eles não são possivel de transformação…

Alias,

Essa questão caiu ontem na minha prova…

Acertei… mas nao passei…

No TestKiller existem vááááárias questões da prova que fiz… pena q nao estudei por ele tambem!

Abraços

Me corrijam se estiver errado, pois também estou aprendendo e inclusive estudando para a prova =)

Acho que uma boa maneira de testar se há possibilidade de realizar um cast é fazer um teste instanceof, certo?
O que eu quero dizer…

SE cat IS-A Dog então posso realizar o cast.

Como neste caso (cat instanceof Dog) é falso, o cast não pode ser realizado!
Certo?

Vlws!

[quote=Murl]Me corrijam se estiver errado, pois também estou aprendendo e inclusive estudando para a prova =)

Acho que uma boa maneira de testar se há possibilidade de realizar um cast é fazer um teste instanceof, certo?
O que eu quero dizer…

SE cat IS-A Dog então posso realizar o cast.

Como neste caso (cat instanceof Dog) é falso, o cast não pode ser realizado!
Certo?

Vlws![/quote]

quase isso, quase … existe so um caso que o cast é permitido, mesmo o instanceOf sendo falso, é quando o valor da variável é nulo…

… so que vc não poderá realizar esse teste no exame ^^ …

… mas se passar no teste não falha o cast, porem se não passar e for nulo, o cast é realizado sem lançar exceções … mas o teste tem q ser realizado para o objeto dentro da variável… por exemplo, neste caso “animal instanceOf Cat” é falso, pois o objeto dentro de animal é um Dog …

e para verificar como é feito o cast…

[code]public final class Class {

public T cast(Object obj) {
if (obj != null && !isInstance(obj))
    throw new ClassCastException();
return (T) obj;
}

}[/code]

como vc ve, ele so testa o instanceof, se o objeto não for nulo…

Então no caso da variavel ser nula o cast sempre vai acontecer?

NullPointerException