casting ?: type - Pourquoi les opérateurs d'assignation composés de Java = +, - =, *, = = / = ne nécessitent-ils pas de transtypage?



5 Answers

Un bon exemple de ce casting utilise * = ou / =

byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57

ou

byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40

ou

char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'

ou

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'
générique variable double

Jusqu'à aujourd'hui, je pensais que par exemple:

i += j;

Était juste un raccourci pour:

i = i + j;

Mais si nous essayons ceci:

int i = 5;
long j = 8;

Alors i = i + j; ne compilera pas mais i += j; va compiler bien.

Cela signifie-t-il qu'en fait i += j; est un raccourci pour quelque chose comme ceci i = (type of i) (i + j) ?




Oui,

essentiellement lorsque nous écrivons

i += l; 

le compilateur convertit cela en

i = (int)(i + l);

Je viens de vérifier le code du fichier .class .

Vraiment une bonne chose à savoir




Le problème ici concerne le transtypage.

Lorsque vous ajoutez int et long,

  1. L'objet int est casted à long et les deux sont ajoutés et vous obtenez un objet long.
  2. mais un objet long ne peut pas être implicitement converti en int. Donc, vous devez le faire explicitement.

Mais += est codé de telle sorte qu'il transforme le transtypage. i=(int)(i+m)




Parfois, une telle question peut être posée lors d'un entretien.

Par exemple, lorsque vous écrivez:

int a = 2;
long b = 3;
a = a + b;

il n'y a pas de conversion automatique. En C ++, il n'y aura aucune erreur lors de la compilation du code ci-dessus, mais en Java, vous obtiendrez quelque chose comme Incompatible type exception .

Donc, pour l'éviter, vous devez écrire votre code comme ceci:

int a = 2;
long b = 3;
a += b;// No compilation error or any exception due to the auto typecasting



Point subtil ici ...

Il y a un transtypage implicite pour i+j lorsque j est un double et que i est un int. Java convertit TOUJOURS un entier en un double lorsqu'il y a une opération entre eux.

Pour clarifier i+=ji est un entier et j est un double peut être décrit comme

i = <int>(<double>i + j)

Voir: cette description du casting implicite

Vous pourriez vouloir transtyper j en (int) dans ce cas pour plus de clarté.






Related