Operador de coerção

Já li em alguns livro mais não estou compreendendo o que é operador de coerção alguém com muita paciência pode me explica como neste exemplo


double average;
int total;
int gradeCounter;

 average = (double) total / gradeCounter;  

Coerção em português é “cast” em inglês.

Em Java ele serve para duas coisas:

  • Quando aplicado a tipos primitivos (int, long, double, char, short, float, byte), ele serve para converter um tipo primitivo em outro, às vezes efetuando truncamento. Exemplo:
int total = 0;
double average = (double) total;
  • Quando aplicado a objetos, ele serve para reinterpretar o tipo do valor de variável ou parâmetro, ou então retornado por um método.

Por exemplo, se você tiver algo como:

Number n = new Long (10);
Long x = (Long) n;

onde Long é uma subclasse de Number,

você sabe que a variável n (cujo tipo é Number) contém um objeto do tipo Long. Portanto você pode efetuar a coerção para Long.

Cara soh pra ver se eu entedi mesmo bem usa-se o cast quando eu quero converter tipo certo…??

[code]
int total =10;//tipo int primitivo
double account;

account = (double) total;

a variavel account recebe total que vale 10 mais com ponto flutuante
dai fica 10.0 é isso…??

Numero n = new Float (10);
Float x = (Float) n;

No caso de variaveis por referencia o cast funciona da seguinte forma
eu sei que a variaveis n e do tipo Numero e contém um objeto Float
dai para que a variaveil x que é Float receba a variavel n que tem um
objeto Float é soh eu usar um cast para converter de Numero para Float
é isso…???

Cast em Java não é sempre conversão. Cuidado :!

É conversão apenas no primeiro caso (tipos primitivos).

No segundo caso é reinterpretação (ou seja, você não pode forçar alguma coisa a tornar-se outra que ela não é. Exemplo:

class Pessoa {}
interface Presidente {}
interface Politico {}
interface Metalurgico {}
interface Operario {}
interface Engenheiro {}
interface Medico {}
interface Professor {}
class Lula extends Pessoa implements Presidente, Politico, Metalurgico, Operario {}
Pessoa lula = new Lula(); 
Presidente pres = (Presidente) lula; // isto é OK
Engenheiro pr = (Engenheiro) lula; // vai haver um ClassCastException

. Outro exemplo:

class Cliente {}
class ClienteEspecial extends Cliente {}
class Mercado {]
class SuperMercado extends Mercado {}
...
Cliente c = new ClienteEspecial(); // isto é OK pois um ClienteEspecial É UM Cliente.
Mercado m = (Mercado) c; // isto não é OK porque c nunca será um Mercado.
Mercado m2 = new SuperMercado();
SuperMercado s = (SuperMercado) m2; // isto é OK porque você sabe que m2 É UM SuperMercado
m = new Mercado();
SuperMercado s2 = (SuperMercado) m; // Isto não é OK porque m não contém um SuperMercado.

no seu caso como aplicou a um tipo primitivo… vc está convertendo o valor do tipo inteiro temporariamente em double… isso nao quer dizer que seu int passou a ser double apenas ali aonde tem o fator coerção ele é double.
Isso acontece qdo vc quer somar int com double… e eh preciso usar a coerção para ter o resultado mais preciso…