Duvida.. Questao Testkiller

7 respostas
Markinhus86

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() {

returnpeep”; } }
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());

7 Respostas

Felagund

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.

Lavieri
<blockquote><div class="quote-author">Markinhus86:</div>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());</blockquote>

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…

G

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

M

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!

Lavieri
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!

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...

public final class Class<T> {

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

}

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

M

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

rodrigobranas

NullPointerException

Criado 13 de maio de 2009
Ultima resposta 14 de mai. de 2009
Respostas 7
Participantes 6