ClassCastException

5 respostas
Lenin666

Galerinha, eu sei que acabei de perguntar uma coisa bem básica, mas assim, ainda tenho uma outra dúvida.
No test killer tem outra questão:

interface Foo {}
class Alpha implements Foo { }
class Beta extends Alpha {}
class Delta extends Beta {
    public static void main( String[] args) {
        Beta x = new Beta();
       // insert code here
    }
}

Which code, inserted at line 16, will cause a
java.lang.ClassCastException?

A. Alpha a = x;

B. Foo f= (Delta)x;

C. Foo f= (Alpha)x;

D. Beta b = (Beta)(Alpha)x;

Resposta: B

Dúvida:
Dentre as opções eu achava que nenhuma estivesse errada, mas fazendo teste no Eclipse, ví que realmente a B estoura a ClassCastException. Mas me corrija quem souber por favor. Eu achei que f conseguiria receber o Cast de Delta pq “Delta” extende Beta, que extende Alpha que implementa Foo.
Fora que eu achei muito louco a alternativa D, “Beta b = (Beta)(Alpha)x;”…, alguém já usou esse tipo de Cast em alguma aplicação?

5 Respostas

danieldomingues86

Concordo plenamente com voce nesse quesito, mas tem um porem, repare que voce fez um new Beta() na linha 7 e nao um new Delta() que eh uma subclasse de Delta, sendo assim a variavel x criada apontara no maximo para o Beta sendo que o Delta nao existe como objeto e assim o Cast nao ocorrera.

L

O objeto x é um Beta.
e Delta é um Beta (extends Beta).
e devido a hierarquia todos eles são Foo,
porém não tem como fazer um cast de x (Beta) para Delta.

Delta é um Beta
mas Beta não é um Delta

moacirjava

Agora se você mudar a linha 7 ai não dá mais a Exception

interface Foo {}
class Alpha implements Foo { }
class Beta extends Alpha {}
public class Delta extends Beta {
    public static void main( String[] args) {
        Beta x = new Delta(); //Beta pode ter um Delta como instancia.
        Foo f= (Delta)x;         //Ai agora nao dah erro.
    }
}
taaqui

1- Primeira forma de entender com analogias.
Dica rapida, lembra, que um filho(subclasse) por se algum dia um pai, mas um pai(superclasse) não vai poder voltar a ser filho.

A. Alpha a = x;
x é beta(filho, subclasse de Alpha) -fazendo cast- Alpha(superClasse de beta), perfeitamente[color=green] valido[/color], aqui é um filho(beta) virando pai(Alpha).

B. Foo f= (Delta)x;
x é beta(Pai, SuperClasse de Delta) -fazendo cast- Delta(subClasse de beta), [color=red]invalido[/color], aqui é um pai(beta) fazendo um cast para filho(Delta).

C. Foo f= (Alpha)x;
x é beta(filho, subClasse de Alpha) -fazendo cast- Alpha(superClasse de beta), perfeitamente[color=green] valido[/color], aqui é um filho(beta) virando pai(Alpha).

D. Beta b = (Beta)(Alpha)x;
x é beta(filho, subClasse de Alpha) -fazendo cast- Alpha(superClasse de beta) -fazendo cast- beta (mesma classe), perfeitamente[color=green] valido[/color], aqui é um filho(beta) virando pai(Alpha) e depois fazendo um cast para própria beta(incesto é crime).

2- Segunda forma de entender usando a ClassCastException:
Essa exceção é lançada quando se tenta converter uma variável de referencia em um tipo que não passa no teste É-UM, no código posterior a questão (B) falha justamente por Beta não ser um (não É-UM) Delta, beta passa no teste de ser um(É-UM) Alpha e Foo, porque Alpha implementa Foo e beta extende Alpha.

Novamente:
Delta extends Beta então Delta é um beta(Delta extends Beta), Alpha(Beta extends Alpha) e Foo(Alpha implements Foo).
Beta extends Alpha então Beta é um Alpha(Beta extends Alpha) e Foo(Alpha implements Foo).
mas Beta nem sabe que Delta existe, por isso quando se tenta transformar Beta em Delta ele lança uma exceção.

Qualquer erro, me corrijam.

Lenin666

Opa taaqui…, muito obrigado pela atenção.

Compreendido plenamente.

Abs();

Criado 29 de julho de 2009
Ultima resposta 4 de ago. de 2009
Respostas 5
Participantes 5