java cast object - 為什麼Java的+ =, - =,* =,/ =複合賦值運算符需要轉換?




5 Answers

和往常一樣,JLS都有答案。 在本例中§15.26.2複合賦值運算符 。 提取物:

形式E1 op= E2的複合賦值表達式等效於E1 = (T)((E1) op (E2)) ,其中TE1的類型,除了E1僅被評估一次。

§15.26.2引用的一個例子

[...]以下代碼是正確的:

short x = 3;
x += 4.6;

並且結果x的值為7,因為它相當於:

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

換句話說,你的假設是正確的。

class

直到今天,我還以為:

i += j;

只是一個捷徑:

i = i + j;

但是,如果我們嘗試這個:

int i = 5;
long j = 8;

那麼i = i + j; 不會編譯,但i += j; 將編譯好。

這是否意味著事實上i += j; 像這樣的東西的快捷方式i = (type of i) (i + j)




非常好的問題。 Java語言規範確認了您的建議。

例如,以下代碼是正確的:

short x = 3;
x += 4.6;

並且結果x的值為7,因為它相當於:

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



你需要在i = i + l情況下explicitlylongint ,然後它將編譯並給出正確的輸出。 喜歡

i = i + (int)l;

要么

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

但是在+=情況下它只是工作正常,因為運算符隱式地從右變量的類型到左變量的類型進行類型轉換,因此不需要顯式轉換。




在Java類型中,當賦值操作右側的表達式類型可以安全地提升為賦值左側的變量類型時,將自動執行轉換。 因此我們可以安全地分配:

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

反之亦然。 例如,我們不能自動將long轉換為int,因為第一個需要比第二個更多的存儲,因此信息可能會丟失。 要強制執行此類轉換,我們必須執行顯式轉換。
類型 - 轉換




主要區別在於a = a + b ,沒有進行類型轉換,因此編譯器因為沒有進行類型轉換而對你生氣。 但是使用a += b ,它真正做的是將類型b轉換為與a兼容的類型。 所以,如果你這樣做

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

你真正在做的是:

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



Related