Casting

Galera eu estou com uma dúvida aqui.
Me corrijam se eu estiver errado:

Quando queremos fazer um cast nós convertemos um objeto de uma superclasse para uma subclasse, certo ?
Por exemplo:
Tenho uma classe Funcionários que é superclasse da classe Gerentes. Ou seja todo gerente é um funcionário, certo? Se eu quiser, eu posso fazer um cast para que um objeto Funcionario se torne Gerente?
Estou estudando pelo livro core java 2 - Vol.1, e segundo ele há um erro no código abaixo:

Funcionario subordinado = new Funcionario(); Gerente chefe = (Gerente) subordinado;

Não entendi por que o codigo acima não funciona enquanto:

double x = 3.14; int a = (int) x;

funciona.

Não estou entendendo direito isso não.
Alguém pode ajudar ?

Valeu galera.

Não confunda Cast de objetos com Cast de primitivos.

No caso de Cast de objetos, sempre é possível ir de um subtipo para o tipo, por exemplo:

Gerente g = new Gerente(); Funcionario f = g; // não precisa nem fazer cast

Mas o contrário nem sempre é verdadeiro. Você só pode ir de uma superclasse para a subclasse SE a superclasse contiver um objeto da subclasse.

Funcionario f = new Gerente();
Gerente g = f; 
// não compila, pois não se pode colocar uma referencia à superclasse
// numa variavel de objeto da subclasse!

o certo nesse caso é usar o casting

Funcionario f = new Gerente();
Gerente g = (Gerente)f; // compila

Lembrando que esse tipo de conversão pode gerar em runtime um ClassCastException.

Portanto da superclasse para a classe é necessário o cast.
Da subclasse para a superclasse não.
Basta lembrar da regra IS-A (É-UM): todo gerente é um funcionário, portanto pode ser tratado como tal. Mas nem todo funcionário é gerente.

No caso do double sendo convertido para o int isso é possivel, pois com o cast você indica ao Java que você tem ciência da perda de precisão ao converter de double para int.

Além disso, no caso de casting de primitivos vale a regra: do maior para o menor deve ser usado casting.

Espero ter tirado suas duvidas.

1 curtida