Boa tarde pessoal.
Estou com uma dúvida sobre Cast.
No seguinte cenário de exemplo (na prática preciso disso pra orçamentos, vendas, pedidos e etc):
Uma classe Pai:
public class Pai {
private String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
Uma classe Filho1:
public class Filho1 extends Pai {
}
Uma classe Filho2:
public class Filho2 extends Pai {
}
Reparem que Filho1 e Filho2 não tem diferenças… apenas herdam o atributo da superclasse…
Eu precisava fazer o seguinte:
public static void main(String[] args) throws CloneNotSupportedException {
Filho1 filho1 = new Filho1();
filho1.setNome("Fulano");
Filho2 filho2 = (Filho2) filho1;
}
mas não consigo… existe alguma maneira de chegar a este resultado?
Abraços
Filho2 filho2 = new Filho2();
filho2.setNome(filho1.getNome());
E repetir isso para todos os campos.
Algo que pode te ajudar a fazer essas cópias é o BeanUtils.copyProperties(filho2, filho1) da biblioteca Apache Commons BeanUtils
Edit: Lembrando de outro projeto que fiz parecido com o teu problema, mas usando Beans de terceiros, preferi usar o )]BeanUtils do Spring Framework, que pelo menos tem uma opção a mais de ignorar algumas propriedades.
E falando em clones, talvez você encontre o problema de Deep Cloning.
A minha solução de deep cloning foi usar o copyProperties do Spring e clonagem via construtor (Filho2 filho2 = new Filho2(filho1), para cada nó da árvore clonada.
[quote=Bruno Laturner][code]
Filho2 filho2 = new Filho2();
filho2.setNome(filho1.getNome());
[/code]
E repetir isso para todos os campos.
Algo que pode te ajudar a fazer essas cópias é o BeanUtils.copyProperties(filho2, filho1) da biblioteca Apache Commons BeanUtils[/quote]
Obrigado por responder Bruno!
Na verdade era justamente isto que estou querendo evitar: copiar atributo por atributo… pois serão dezenas…
Precisaria de algo que realmente fizesse um clone, mas trocando a classe…
Deu certo!
Li um pouco sobre JSON, fiz uns testes… e acabei criando uma maneira de fazer isto… obviamente que só funciona porque no meu caso os objetos serão identicos… só tenho q fazer isto porque eles tem necessariamente que estar em tabelas separadas…
segue o método que criei pra fazer isso:
private static Object castObjectJson(Object objeto, Class clazz) {
Object retorno = null;
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
try {
String objectJson = mapper.writeValueAsString(objeto);
retorno = mapper.readValue(objectJson, clazz);
} catch (JsonGenerationException e) {
} catch (JsonMappingException e) {
} catch (IOException e) {
}
return retorno;
}
e uso assim:
Filho1 filho1 = new Filho1();
filho1.setNome("RODRIGO");
Filho2 filho2 = (Filho2) castObjectJson(filho1, Filho2.class);
Obrigado pela atenção!
Editei a minha resposta acima. Eu usaria o copyProperties do Spring.
O teu método que vc postou é clonagem via serialização. O Commons Lang tem um SerializationUtils que faz isso. Mas não resolve o teu problema com classes diferentes.