Michael Urban postou um depoimento interessante no Javalobby:

"Eu percebi isto enquanto debugava um c�digo...
Uma das funcionalidades de Java projetadas para tornar nossa vida mais
f�cil ao degugar s�o os catchs de atribui��o do compilador que
resultaria em perda de precis�o, nos dizendo que devemos realizar um
cast expl�cito, certo? Por exemplo, aqui temos um exemplo de c�digo:
int a = 5;
float b = 7.5;
a = a + b; // Erro de compila��o. Cast expl�cito � necess�rio por
causa de uma poss�vel perda de precis�o.

O compilador n�o deixar� passar, pois resulta em perda de precis�o.
Nenhuma surpresa aqui. Precisamos fazer um cast expl�cito se quisermos
adicionar b a a.
Mas vamos modificar um pouco o c�digo:
int a = 5;
float b = 7.5;
a += b;

O c�digo compilar� bem sem ao menos uma advert�ncia sobre a perda de
precis�o que ir� acontecer. A princ�pio pensei ter descoberto um bug
no javac. Encontrei outro programador Java que achava realmente que
fosse um bug. Ent�o fiz uma busca no banco de bugs, assim como na
especifica��o da linguagem, e acabei encontrando isto:
A compound assignment expression of the form E1 op= E2 is equivalent
to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1
is evaluated only once. Note that the implied cast to type T may be
either an identity conversion (�5.1.1) or a narrowing primitive
conversion (�5.1.3). For example, the following code is correct:

short x = 3;
x += 4.6;

and results in x having the value 7 because it is equivalent to:

short x = 3;
x = (short)(x + 4.6);

Interessante... Isto significa que meu "bug" n�o � um bug na
realidade, na verdade � um "funcionalidade".

Isto foi uma grande surpresa dado que v�rios tutoriais (incluindo o
pr�prio Java tutorial da Sun) ensina que a += b � equivalente a a = a
+ b. Por�m podemos ver que n�o s�o realmente equivalentes. A
atribui��o composta ir� silenciosamente realizar um cast impl�cito o
que resultar� em perda de precis�o sem ao menos uma advert�ncia do
compilador. � muito f�cil introduzir bugs s�bitos no seu programa por
causa dessa funcionalidade. Especialmente por ir contra o que
esperar�amos de um comportamento normal do javac dado o grande n�mero
de situa��es de perda de precis�o. O que diabos a Sun estava pensando
quando adicionou essa funcionalidade?"

-------------------------------------------------------------------------------------------
Ceara' Java User Group

  Para cancelar sua assinatura, envie um e-mail para: [EMAIL PROTECTED]
  Para mais informacoes, mande um e-mail para: [EMAIL PROTECTED]
  Falar com o administrador? e-mail para: [EMAIL PROTECTED] 
 

Responder a