estou com um problema relacionado ao casting de objetos java. Tenho uma classe Sala com seus atributos e metodos. possuo varias subclasses que herdam de Sala já que são Salas. Nessas subclasses eu apenas mudo o valor de algumas variaveis ja que que todas sao salasi, dai eu crio um objeto Sala
Sala salaCriada = null;
// novaSalaComVariaveismodificadas é um subtipo de Sala.
salaCriada = novaSalaComVariaveismodificadas;
return salaCriada;
este objeto que retorno é uma sala de certeza. O problema é que ele vem com os valores dos atributos iguais aos definidos na classe Sala e nao com os valores modificados. Para fazer as mudanças eu uso os setters das variaveis de sala Ex novaSalaComVariaveismodificadas.setFinalidade(“fnovo texto”); mas ao fazer o casting para Sala graças ao polimofismo o valor de salaCriada.getFinalidade ainda é o valor antigo. Já tentei diretamente:
salaCriada.setFinalidade(“novoTexto”);
return salaCriada;
mas da o mesmo resultado.
.Alguma sugestão?
Problema com casting de objetos java
4 Respostas
Utilize o polimorfismo a seu favor.
Sala salaCriada = new salaComAtributosModificados();
Posta seu código aqui. Fica mais fácil de te ajudar.
O problema deve estar nas próprias classes e não na criação do objeto.
aqui o codigo:
PS estou usando o factory method.
package Sala;
import java.util.ArrayList;
import Evento.Evento;
/**
*
*
*/
public class Sala extends CriacaoDeSalas {
private String id;
private String tipo;
private String finalidade;
private String apelido;
private boolean estadoAberto;
private ArrayList eventosDaSala;
private ArrayList tiposValidos;
public ArrayList getTiposValidos() {
return tiposValidos;
}
public void setTiposValidos(ArrayList tiposValidos) {
this.tiposValidos = tiposValidos;
}
public ArrayList getEventosDaSala() {
return eventosDaSala;
}
public void setEventosDaSala(ArrayList eventosDaSala) {
this.eventosDaSala = eventosDaSala;
}
public String getApelido() {
return apelido;
}
public void setApelido(String apelido) {
this.apelido = apelido;
}
public boolean isEstadoAberto() {
return estadoAberto;
}
public void setEstadoAberto(boolean estadoAberto) {
this.estadoAberto = estadoAberto;
}
private int capacidadeFisica;
public int getCapacidadeFisica() {
return capacidadeFisica;
}
public void setCapacidadeFisica(int capacidadeFisica) {
this.capacidadeFisica = capacidadeFisica;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTipo() {
return tipo;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
public String getFinalidade() {
return finalidade;
}
public void setFinalidade(String finalidade) {
this.finalidade = finalidade;
}
@Override
public Sala criarSalas(String id, int capacidade, String finalidade, String tipo, String apelido, boolean aberto) {
Sala sala = new Sala();
return sala;
}
}
package Sala;
import Sala.Escritorio.Escritorio;
import Sala.Laboratorio.Laboratorio;
import Sala.Laboratorio.LaboratorioDeBiologia;
import Sala.Laboratorio.LaboratorioDeComputacao;
import Sala.Laboratorio.LaboratorioDeFisica;
import Sala.Laboratorio.LaboratorioDeQuimica;
import Sala.SalaDeConferencia.Conferencia;
import Sala.SalaDeConferencia.SalaDeConferenciaNormal;
import Sala.SalaDeConferencia.SalaDeVideoConferencia;
import Sala.SalaDeConferencia.VideoConferencia;
import Sala.SalasDeAula.SalaDeAula;
import Sala.SalasDeAula.SalaDeAulaComComferencia;
import Sala.SalasDeAula.SalaDeAulaComVideoConferencia;
import Sala.SalasDeAula.SalaDeAulaInteligente;
import Sala.SalasDeAula.SalaDeAulaNormal;
/**
- @
*/
public abstract class CriacaoDeSalas {
/** cria e retorna uma nova sala de acordo com os paramentos passados
* @param id = identificador de sala.
* @param capacidade = quantidade maxima de pessoas na sala.
* @param finalidade = finalidade da sala.
* @param tipo = tipo da sala.
* @param apelido = apelido da sala.
* @param aberto = se a sala esta aberta para alocação de novos eventos.
* @return Sala
*/
public abstract Sala criarSalas(String id, int capacidade, String finalidade, String tipo, String apelido, boolean aberto);
/** Charma o metodo criar salas que é implementado pelas subclasses de salas elhe passa os parametos para a criação de salas.
* @param id = identificador de sala.
* @param capacidade = quantidade maxima de pessoas na sala.
* @param finalidade = finalidade da sala.
* @param tipo = tipo da sala.
* @param apelido = apelido da sala.
* @param aberto = se a sala esta aberta para alocação de novos eventos.
* @return Sala
* @throws CapacidadeInvalidaException
* @throws TipoInvalidoException
*/
public static Sala pediSalas(String id, int capacidade, String finalidade, String tipo, String apelido, boolean aberto) throws CapacidadeInvalidaException, TipoInvalidoException{
Sala salaCriada = new Sala();
salaCriada = salaCriada.criarSalas(id,capacidade, finalidade, tipo, apelido, aberto);
return salaCriada;
}
}
package Sala.SalasDeAula;
import java.util.ArrayList;
import Sala.CriacaoDeSalas;
import Sala.Sala;
/**
*
*
<em>/
public abstract class SalaDeAula extends Sala{
private ArrayList tiposPossiveisDestaSala;
public ArrayList getTiposPossiveisDestaSala() {
return tiposPossiveisDestaSala;
}
/</em>*
* Define a finalidade sala de aula.
*/
public SalaDeAula(){
super.setFinalidade(“Sala de Aula”);
// populando tipos que serao aceitos por essa sala.
tiposPossiveisDestaSala = new ArrayList();
tiposPossiveisDestaSala.add(“Normal”);
tiposPossiveisDestaSala.add(“Inteligente”);
tiposPossiveisDestaSala.add(“Videoconferencia”);
super.setTiposValidos(tiposPossiveisDestaSala);
}
}
package Sala.SalasDeAula;
import java.util.ArrayList;
import Evento.Evento;
import Evento.EventoAulaInteligente;
import Evento.imtefacesComunsEventosSalas.Inteligente;
import Sala.Sala;
import Sala.SalasDeAula.interfacesDeSalaDeAulaEscritorio.SalaInteligente;
/**
*
*
*/
public class SalaDeAulaInteligente extends SalaDeAula implements SalaInteligente{
public SalaDeAulaInteligente(String id, int capacidade, String tipo){
super();
super.setId(id);
super.setCapacidadeFisica(capacidade);
super.setTipo(tipo);
}
public SalaDeAulaInteligente(String id, int capacidade,String tipo, String apelido){
super();
super.setId(id);
super.setCapacidadeFisica(capacidade);
super.setApelido(apelido);
super.setTipo(tipo);
}
public SalaDeAulaInteligente(String id, int capacidade ,String tipo, String apelido, boolean aberto){
super();
super.setId(id);
super.setCapacidadeFisica(capacidade);
super.setApelido(apelido);
super.setEstadoAberto(aberto);
super.setTipo(tipo);
super.setApelido("");
}
private ArrayList <Evento> eventosDaSala;
public ArrayList<Evento> getEventosDaSala() {
return eventosDaSala;
}
public void setEventosDaSala(ArrayList<Evento> eventosDaSala) {
this.eventosDaSala = eventosDaSala;
}
@Override
public void addEvento(EventoAulaInteligente eventoAulaInteligente) {
eventosDaSala.add(eventoAulaInteligente);
}
@Override
public Sala criarSalas(String id, int capacidade, String finalidade, String tipo, String apelido, boolean aberto) {
Sala salaCriada = null;
if (tipo.equalsIgnoreCase("Inteligente")){
SalaDeAulaInteligente salaDeAulaInteligente = new SalaDeAulaInteligente(id, capacidade, tipo);
if (apelido != null){
salaDeAulaInteligente = new SalaDeAulaInteligente(id, capacidade, tipo, apelido);
}
if (aberto){
salaDeAulaInteligente = new SalaDeAulaInteligente(id, capacidade, tipo, apelido, aberto);
}
salaCriada = salaDeAulaInteligente;
}
return salaCriada;
}
}
public void adicionarSala(String id, int capacidade, String finalidade, String tipo)
throws RoomsAllocationException, CapacidadeInvalidaException, TipoInvalidoException, IdentificacaoInvalidaException, FinalidadeInvalidaException {
// fazendo a validacao
boolean atributosValidos = true;
ValidatorDeSala validando;
try {
validando = new ValidatorDeSala(id, capacidade, finalidade, tipo, "", false);
atributosValidos = validando.validar(id, capacidade, finalidade, tipo, "", false);
} catch (FinalidadeInvalidaException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
} catch (IdentificacaoInvalidaException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}catch (TipoInvalidoException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}catch (CapacidadeInvalidaException e){
System.out.println(e.getMessage());
}
boolean idValido = true;
idValido = this.idNaoExistente(id, salas);
if(atributosValidos && idValido){
Sala sala = CriacaoDeSalas.pediSalas(id, capacidade, finalidade, tipo, "", false);
this.salas.add(sala);
}
this.imprimirListaDeSalas();
}
este é todo o caminho que os parametos passam. PS existem dezenas de outros subtipos de classes salas. Não as postei pois o processo é o mesmo.este ultimo metodo é o mais importante.
Não analisei todo o código mas não há sobrescrita de métodos static. O teu problema pode estar aqui.