Dúvida sobre ClassCastException!

8 respostas
P

Galera,

Olhem o seguinte código:

class Alpha {
        void a(){}
}
class Beta extends Alpha{
        void b(){}
}
class Gamma extends Beta{}

class Ba{
        public static void main(String[] args) {
	Alpha [] a = {new Alpha(), new Beta(), new Gamma()};
	       for (Alpha a2 : a){
		if (a2 instanceof Beta || a2 instanceof Gamma)
	    
                         	[b]// linha 1 OK!
		((Beta)a2).a();[/b]		
                               [b]// linha 2 Lança ClassCastException
	              ((Gamma)a2).a();[/b]		}
	}
}

A dúvida é:

Por que a linha 2 lança uma ClassCastException??

Se puderem me explicar com detalhes eu agradeço!!

8 Respostas

P

Corrigindo:

É chamado o método b() e não a()!!
// OK
((Beta)a2).b();

// Lança ClassCastException
((Gamma)a2).b();

G

Tente executar em modo debugger e você vai entender mais fácil. Mas basicamente é porque ele passa pelo if no primeiro item, e como o primeiro item é um alfa e você tenta convertê-lo pra Gama, pois a conversão para gama está fora do if, ele erro na conversão. Tente executar o código abaixo, não sei se é o que você queria, mas esse não dá erro.

class Alpha {
	void a() {
	}
}

class Beta extends Alpha {
	void b() {
	}
}

class Gamma extends Beta {
}

public class Ba {
	public static void main(String[] args) {
		Alpha[] a = { new Alpha(), new Beta(), new Gamma() };
		for (Alpha a2 : a) {
			if (a2 instanceof Beta)
				((Beta) a2).a();
			else if (a2 instanceof Gamma)
				((Gamma) a2).a();
			
		}
	}
}
R

ClassCastException é uma exceção que é lançada quando você tenta “converter” o tipo de uma variável que não é compatível com o novo tipo.

No seu código você está dizendo que se a instância for Beta ou Gamma você deve “converter” para Beta e, em seguida, para Gamma. Tudo que é instanceof Gamma pode ser convertido para Beta (pois Gamma É-UM [herança] Beta), então a suna “conversão” nunca falharia na linha 1.

Já na linha 2, quando o objeto for instanceof Beta e você tentar “converter” para Gamma, será lançada a exceção porque Beta não É-UM Gamma e, por isso, o tipo novo (Gamma) é incompatível com o antigo (Beta).

[]'s

P

grustk,

Isso me gerou + 1 dúvia:

Pq o teste if funciona no item 0 do array de Alpha??

Pra mim tá 1/2 confuso!! :?: :?: :?:

diego2005

Cara, executa esse programa e tenta entender a saída dele, acho que vai ficar + claro:

class Alpha {
    void a() {
    }
}
 
class Beta extends Alpha {
    void b() {
    }
}
 
class Gamma extends Beta {
}
 
public class Ba {
    public static void main(String[] args) {
        Alpha[] a = { new Alpha(), new Beta(), new Gamma() };
        for(int i = 0; i < a.length; i++) {
            if (a[i] instanceof Alpha) {
                System.out.println("a[" + i + "] e' instancia de Alpha");
            } else {
                System.out.println("a[" + i + "] nao e' instancia de Alpha");
            }
            if (a[i] instanceof Beta) {
                System.out.println("a[" + i + "] e' instancia de Beta");
            } else {
                System.out.println("a[" + i + "] nao e' instancia de Beta");
            }
            if (a[i] instanceof Gamma) {
                System.out.println("a[" + i + "] e' instancia de Gamma");
            } else {
                System.out.println("a[" + i + "] nao e' instancia de Gamma");
            }

            System.out.println();
        }
    }
}

Qualquer coisa é só falar...

T+

P

Então quer dizer que o instanceof retorna true se a referência da esquerda se referenciar tanto ao seu objeto quanto ao objeto do seu supertipo!!

Entendi!!

Mas, o meu maior problema é que ñ estou conseguindo assimilar isso:

Alpha alpha = new Alpha();

// ClassCastException
Beta beta = (Beta) alpha;

Beta ñ é um Alpha?!

Então pq é lançada a excessão??

diego2005

Um OBJETO do tipo Beta é um Alpha. Mas o que você criou ai foi um objeto do tipo Alpha, e um objeto Alpha só passa no teste instanceof nas seguintes opções:

Alpha alpha = new Alpha(); if(alpha instanceof Object) { ... } // true if(alpha instanceof Alpha) { ... } // true

Agora veja o seguinte:

Alpha alpha = new Beta(); Beta beta = (Beta) alpha; // ok, o OBJETO que a variável alpha referência é um Beta

Entendeu agora??

T+

P

Aí valew mmo.

:smiley: :smiley: :smiley:

Criado 17 de agosto de 2007
Ultima resposta 18 de ago. de 2007
Respostas 8
Participantes 4