java class cast




為什麼Java的+=,-=,*=,/=複合賦值運算符需要轉換? (7)

主要區別在於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);

直到今天,我還以為:

i += j;

只是一個捷徑:

i = i + j;

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

int i = 5;
long j = 8;

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

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


你需要在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,因為第一個需要比第二個更多的存儲,因此信息可能會丟失。 要強制執行此類轉換,我們必須執行顯式轉換。
類型 - 轉換


是,

基本上我們寫的時候

i += l; 

編譯器將其轉換為

i = (int)(i + l);

我剛檢查了.class文件代碼。

真的是一件好事


這個演員的一個很好的例子是使用* =或/ =

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

要么

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

要么

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

要么

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

這裡的問題涉及類型鑄造。

當你添加int和long時,

  1. int對像被轉換為long並且兩者都被添加並且你得到長對象。
  2. 但是長對像不能隱式地轉換為int。 所以,你必須明確地這樣做。

但是+=以這樣的方式編碼,即它進行類型轉換。 i=(int)(i+m)


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

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

short x = 3;
x += 4.6;

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

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




assignment-operator