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]
