Spyman, o problema é que você parece ainda está confuso com os conceitos de orientação a onjetos.
Corpo ouro = new Corpo(); //Cria uma instancia de Corpo, referenciada por ouro
Corpo ferro = new Corpo(); //Cria uma instancia de Corpo, referenciada por ferro
Sua memória ficaria ± assim.
ouro ---referencia aponta para o objeto---> +-------+
|Corpo |
+-------+
ferro ---referencia aponta para o objeto---> +-------+
|Corpo |
+-------+
Isso significa que você tem dois objetos criados na memória. Esses objetos são do tipo Corpo e cada um tem uma referência apontando pra eles.
Quando você faz:
if (alguma coisa) {
corpoAtual = "ouro";
} else {
corpoAtual = "ferro";
}
Sua memória passa a ser
ouro ---referencia aponta para o objeto---> +-------+
|Corpo |
+-------+
ferro ---referencia aponta para o objeto---> +-------+
|Corpo |
+-------+
corpoAtual ---referencia aponta para o objeto---> +--------+
|String |
+--------+
O conteudo pode ser "ferro"
ou "ouro", dependendo do if...
Quando você tenta
[Code]
Corpo aux = (Corpo)corpoAtual;
/Code]
O que a linguagem faz é:
1 - Existe uma referência chamada corpoAtual, que aponta para um objeto do tipo String
2 - Do lado esquerdo da operação, existe uma referencia chamada aux
que aponta para um objeto do tipo Corpo
3 - O Java tenta converter a referencia corpoatual, que é uma String, para um objeto do tipo Corpo.
4 - Só que String e Corpo não tem nada em comum. São objetos completamente diferentes. O compilador acusará erro.
Esses conceitos de orientação a objetos precisam ser entendidos. Não sei se pude ajudar. Explicar isso é meio complicado pra mim.
A solução do HashMap funciona bem legal, pois você associa um objeto através de um identificador. Mas estude os conceitos de OOP. Eles são extremamente importantes.