2011-11-14 68 views
3

讓我們考慮Java中的一些簡單表達式。Java中的類型轉換和自動類型提升

byte var=0; 

var=(byte)(var+1); 

這裏,在上面的語句,很明顯的類型,因爲自動型的推廣需要鑄造。

表達(VAR + 1)進行評價的結果自動提升因此INT,必須明確地被轉換爲字節到它的結果分配給一個字節變量在其上是變種分配的權


現在,讓我們考慮下面的Java語句。

var++; 

這有點等同於前面的陳述,應該需要一個強制轉換,儘管它沒有強制轉換。爲什麼?


即使下面的語句不需要轉換。爲什麼?

byte x=var++; 
+1

只有當您不能將(byte)1添加到var時,它纔是等價的,但您可以 - 爲什麼不會++使用正確的類型? –

回答

9

Java Language Specification, §15.14.2

類型後綴增量表達的是可變的類型。

在另一方面,對於表達var + 1,適用下列規則(JLS, §5.6.2):

當操作者施加的二進制數值提升到一對操作數,其中的每一個必須表示一個值可以轉換爲數值類型,按照以下規則,按順序使用widening conversion (§5.1.2)根據需要轉換操作數:

•如果任何操作數是引用類型,則執行unboxing conversion (§5.1.8)。然後:
•如果任一操作數的類型爲double,則另一個操作數轉換爲double。
•否則,如果任一操作數的類型爲float,則另一個操作數轉換爲float。
•否則,如果任一操作數的類型爲long,則另一個操作數轉換爲long。
•否則,兩個操作數都轉換爲int類型。

因此,添加兩個數字類型將永遠不會給出比int更窄的結果。