Perché Java + =, - =, * =, / = gli operatori di assegnazione composti richiedono il casting?


Answers

Un buon esempio di questo casting sta usando * = o / =

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

o

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

o

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

o

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'
Question

Fino ad oggi, ho pensato che ad esempio:

i += j;

è solo una scorciatoia per:

i = i + j;

Ma cosa succede se proviamo questo:

int i = 5;
long j = 8;

Quindi i = i + j; non verrà compilato ma i += j; compilerà bene.

Significa che in effetti i += j; è una scorciatoia per qualcosa di simile a questo i = (type of i) (i + j) ?




Sì,

fondamentalmente quando scriviamo

i += l; 

il compilatore lo converte in

i = (int)(i + l);

Ho appena controllato il codice file .class .

Davvero una cosa buona da sapere




A volte, una tale domanda può essere posta in un colloquio.

Ad esempio, quando scrivi:

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

non esiste un typecasting automatico. In C ++ non ci sarà alcun errore nella compilazione del codice sopra, ma in Java si otterrà qualcosa come l' Incompatible type exception .

Quindi per evitarlo, devi scrivere il tuo codice in questo modo:

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



Punto sottile qui ...

Esiste un typecast implicito per i+j quando j è un double e i è un int. Java SEMPRE converte un numero intero in un doppio quando c'è un'operazione tra di loro.

Per chiarire i+=j dove i è un intero e j è un doppio può essere descritto come

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

Vedi: questa descrizione del casting implicito

Potresti voler digitare j to (int) in questo caso per chiarezza.




Il problema qui riguarda il casting di tipo.

Quando aggiungi int e long,

  1. L'oggetto int è castato a lungo e entrambi vengono aggiunti e si ottiene oggetto lungo.
  2. ma l'oggetto lungo non può essere implicitamente convertito in int. Quindi, devi farlo esplicitamente.

Ma += è codificato in modo tale da digitare casting. i=(int)(i+m)




Links