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




5 Answers

Come sempre con queste domande, il JLS ha la risposta. In questo caso §15.26.2 Operatori di assegnazione composti . Un estratto:

Un'espressione di assegnazione composta della forma E1 op= E2 è equivalente a E1 = (T)((E1) op (E2)) , dove T è il tipo di E1 , tranne che E1 viene valutato solo una volta.

Un esempio citato da §15.26.2

[...] il seguente codice è corretto:

short x = 3;
x += 4.6;

e ha come risultato che x ha il valore 7 perché è equivalente a:

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

In altre parole, la tua ipotesi è corretta.

define an

Fino ad oggi, ho pensato che ad esempio:

i += j;

Era solo una scorciatoia per:

i = i + j;

Ma 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) ?




Ottima domanda La specifica della lingua Java conferma il tuo suggerimento.

Ad esempio, il seguente codice è corretto:

short x = 3;
x += 4.6;

e ha come risultato che x ha il valore 7 perché è equivalente a:

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



è necessario eseguire il cast da long a int explicitly in caso di i = i + l quindi verrà compilato e restituito l'output corretto. piace

i = i + (int)l;

o

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

ma nel caso di += funziona semplicemente perché l'operatore fa implicitamente il casting del tipo da tipo di variabile destra a tipo di variabile sinistra, quindi non è necessario eseguire il cast esplicito.




Nelle conversioni di tipo Java vengono eseguite automaticamente quando il tipo di espressione sul lato destro di un'operazione di assegnazione può essere promosso in sicurezza al tipo della variabile sul lato sinistro del compito. Quindi possiamo tranquillamente assegnare:

 byte -> short -> int -> long -> float -> double. 

Lo stesso non funzionerà al contrario. Ad esempio, non possiamo convertire automaticamente un long in un int perché il primo richiede più spazio di archiviazione del secondo e di conseguenza le informazioni potrebbero andare perse. Per forzare una tale conversione, dobbiamo effettuare una conversione esplicita.
Tipo - Conversione




La differenza principale è che con a = a + b , non si sta verificando il typecasting, e quindi il compilatore si arrabbia con te per non aver eseguito un typecasting. Ma con a += b , ciò che realmente sta facendo è typecasting b con un tipo compatibile con a . Quindi se lo fai

int a=5;
long b=10;
a+=b;
System.out.println(a);

Quello che stai facendo davvero è:

int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);



Related