classAlpha{voida(){}}classBetaextendsAlpha{voidb(){}}classGammaextendsBeta{}classBa{publicstaticvoidmain(String[]args){Alpha[]a={newAlpha(),newBeta(),newGamma()};for(Alphaa2:a){if(a2instanceofBeta||a2instanceofGamma)[b]// linha 1 OK!((Beta)a2).a();[/b][b]// linha 2 Lança ClassCastException((Gamma)a2).a();[/b]}}}
É chamado o método b() e não a()!!
// OK
((Beta)a2).b();
// Lança ClassCastException
((Gamma)a2).b();
G
grustk
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.
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
Pitagoras
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:
classAlpha{voida(){}}classBetaextendsAlpha{voidb(){}}classGammaextendsBeta{}publicclassBa{publicstaticvoidmain(String[]args){Alpha[]a={newAlpha(),newBeta(),newGamma()};for(inti=0;i<a.length;i++){if(a[i]instanceofAlpha){System.out.println("a["+i+"] e' instancia de Alpha");}else{System.out.println("a["+i+"] nao e' instancia de Alpha");}if(a[i]instanceofBeta){System.out.println("a["+i+"] e' instancia de Beta");}else{System.out.println("a["+i+"] nao e' instancia de Beta");}if(a[i]instanceofGamma){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
Pitagoras
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:
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: