Olá pessoal!
Gostaria de saber se é possível fazer downcast em Java, ou seja, uma vez que tenha instanciado uma classe, ter a possibilidade de mais a frente informar que tal classe passe a se comportar como uma das sub-classes da classe original.
Pra ficar um pouco mais claro o problema.
Eis a classe ProcedimentoMetodologicopackage br.ufrj.cos.ese.configuradorrs.entity.ontologia;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.Name;
import br.ufrj.cos.ese.configuradorrs.entity.ontologia.procedimentoMetodologico.ApoioFerramental;
import br.ufrj.cos.ese.configuradorrs.entity.ontologia.procedimentoMetodologico.CodificacaoDados;
import br.ufrj.cos.ese.configuradorrs.entity.ontologia.procedimentoMetodologico.GerenciaDadosOmissos;
import br.ufrj.cos.ese.configuradorrs.entity.ontologia.procedimentoMetodologico.GerenciaUnidadeAnalise;
import br.ufrj.cos.ese.configuradorrs.entity.ontologia.procedimentoMetodologico.MetodoAnalise;
import br.ufrj.cos.ese.configuradorrs.entity.ontologia.procedimentoMetodologico.ProtocoloRevisaoSistematica;
import br.ufrj.cos.ese.configuradorrs.entity.ontologia.procedimentoMetodologico.RelatorioExecucaoRevisaoSistematica;
/**
* @author Rafael
* @version 1.0
* @created 26-out-2010 12:07:48
*/
@Name("procedimentoMetodologico")
@AutoCreate
@Entity
public class ProcedimentoMetodologico implements Serializable {
/**
*
*/
private static final long serialVersionUID = -8355811334112074382L;
private Long id;
private String descricao;
public RelatorioExecucaoRevisaoSistematica m_RelatorioExecucaoRevisaoSistematica;
public ProtocoloRevisaoSistematica m_ProtocoloRevisaoSistematica;
public GerenciaDadosOmissos m_GerenciaDadosOmissos;
public ApoioFerramental m_ApoioFerramental;
public MetodoAnalise m_MetodoAnalise;
public CodificacaoDados m_CodificacaoDados;
public GerenciaUnidadeAnalise m_GerenciaUnidadeAnalise;
@Id @GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
/*
public RelatorioExecucaoRevisaoSistematica getM_RelatorioExecucaoRevisaoSistematica() {
return m_RelatorioExecucaoRevisaoSistematica;
}
public void setM_RelatorioExecucaoRevisaoSistematica(
RelatorioExecucaoRevisaoSistematica mRelatorioExecucaoRevisaoSistematica) {
m_RelatorioExecucaoRevisaoSistematica = mRelatorioExecucaoRevisaoSistematica;
}
*/
public ProtocoloRevisaoSistematica getM_ProtocoloRevisaoSistematica() {
return m_ProtocoloRevisaoSistematica;
}
public void setM_ProtocoloRevisaoSistematica(
ProtocoloRevisaoSistematica mProtocoloRevisaoSistematica) {
m_ProtocoloRevisaoSistematica = mProtocoloRevisaoSistematica;
}
/*
public GerenciaDadosOmissos getM_GerenciaDadosOmissos() {
return m_GerenciaDadosOmissos;
}
public void setM_GerenciaDadosOmissos(GerenciaDadosOmissos mGerenciaDadosOmissos) {
m_GerenciaDadosOmissos = mGerenciaDadosOmissos;
}
*/
public ApoioFerramental getM_ApoioFerramental() {
return m_ApoioFerramental;
}
public void setM_ApoioFerramental(ApoioFerramental mApoioFerramental) {
m_ApoioFerramental = mApoioFerramental;
}
/*
public MetodoAnalise getM_MetodoAnalise() {
return m_MetodoAnalise;
}
public void setM_MetodoAnalise(MetodoAnalise mMetodoAnalise) {
m_MetodoAnalise = mMetodoAnalise;
}
public CodificacaoDados getM_CodificacaoDados() {
return m_CodificacaoDados;
}
public void setM_CodificacaoDados(CodificacaoDados mCodificacaoDados) {
m_CodificacaoDados = mCodificacaoDados;
}
public GerenciaUnidadeAnalise getM_GerenciaUnidadeAnalise() {
return m_GerenciaUnidadeAnalise;
}
public void setM_GerenciaUnidadeAnalise(
GerenciaUnidadeAnalise mGerenciaUnidadeAnalise) {
m_GerenciaUnidadeAnalise = mGerenciaUnidadeAnalise;
}
*/
public ProcedimentoMetodologico(){
}
}
Como vocês podem perceber, essa classe possui relacionamento com outras classes. Em minha aplicação, uma das primeiras coisas a serem feitas é instanciar um objeto do tipo ProtocoloRevisaoSistematica.
Sendo assim, para poder instanciar esse objeto eu devo instanciar antes um objeto do tipo ProcedimentoMetodologico.
public class QuasiRevisaoSistematica extends ProcedimentoMetodologico {
/**
*
*/
private static final long serialVersionUID = -7701308951652636053L;
public QuasiRevisaoSistematica(){
}
}
public class MetaAnalise extends ProcedimentoMetodologico {
/**
*
*/
private static final long serialVersionUID = -2260206889790309648L;
public MetaAnalise(){
}
}
Sendo assim, com base na tomada de decisão do usuário, devo instanciar um objeto do tipo MetaAnalise ou QuasiRevisaoSistematica. No entanto, eu já tenho um objeto do tipo ProcedimentoMetodologico instanciado. Por isso, gostaria de saber se existe algum mecanismo de fazer o downcast, ou seja, dizer que o objeto do tipo ProcedimentoMetodologico agora vai assumir a identidade de MetaAnalise ou QuasiRevisaoSistematica
Se não for possível, qual seria a solução mais elegante para contornar este problema? (Contando com a restrição de que não é possível adiantar a parte da aplicação onde ocorre a tomada de decisão)
Abraço!
