Duvida sobre heranca

5 respostas
aers

Olá, estou utilizando o AntLR para construir um compilador portugol e tive que criar algumas classes extras para fazer uma analise semantica mais pratica.
Construi uma classe GramaticaAST que extende de CommonTree.

package Gramatica;

import org.antlr.runtime.Token;
import org.antlr.runtime.tree.CommonTree;

public class GramaticaAST extends CommonTree {
	
	public Simbolo simbolo;
	public String expType = "";
	public String expSecType = "";
	
	public GramaticaAST(Token t) {
		super(t);
	}

}

No entando algo estranho esta acontecendo…
No GramaticaParser eu chamo o metodo:

root_1 = (GramaticaAST)adaptor.becomeRoot(stream_tipo.nextNode(), root_1);
que retorna uma CommonTree, porém esta gerando uma Exception:

Exception in thread main java.lang.ClassCastException: org.antlr.runtime.tree.CommonTree cannot be cast to Gramatica.GramaticaAST

at Gramatica.GramaticaParser.declVars(GramaticaParser.java:489)

at Gramatica.GramaticaParser.prog(GramaticaParser.java:239)

at Main.main(Main.java:34)

Entao… como esta gerando essa Exception se GramaticaAST extende de CommonTree ??

5 Respostas

M

Bom dia amigo,
Realmente é necessário esse cast?
Já que essa nova classe estende da classe que vc sera requisitando, acho que não é necessário.

Espero que tenha ajudado. Até a próximo.

heatcold

Para validar uma atribuição entre dois objetos de tipos diferentes, apenas verifique se a condição IS-A está sendo satisfeita.

No seu exemplo você tenta atribuir CommonTree para GramaticaAST.
Então devemos nos perguntar: CommonTree IS-A GramaticaAST?

Como você mesmo disse anteriormente GramaticaAST extends CommonTree e não o contrário.
Nesse caso, a resposta seria NAO (CommonTree NOT IS-A GramaticaAST) e por isso o Java lançou uma ClassCastException.

Outro comentário pertinente é que subclasses são implicitamente convertidas, durante uma atribuição para sua super classe, sem a necessidade de casting.
Então você poderia fazer algo assim sem problemas:
CommonTree = GramaticaAST
(GramaticaAST IS-A CommonTree)

aers

Sim, é necessário, pois adaptor retorna Object

heatcold

entendeu o por que do problema?

aers

Entendi heatcold… valeu obrigado.

Criado 23 de outubro de 2011
Ultima resposta 23 de out. de 2011
Respostas 5
Participantes 3