2015-06-11 28 views
0
byte b = 0xFFFFFFFF; //OK, because integer -1 sits between -128 and 127, FINE!! 
char ch = 0xFFFFFFFF; //Not OK, because integer -1 does not sit between 0 and 65535, FINE!! 
byte b = 0L; //Compiler says Not OK? But long integer 0 sits between -128 and 127? 

我不相信Java編譯器在上面第三行代碼中應用的縮小規則。java中的隱式縮小規則

請幫我理解,這個縮小規則背後的邏輯。

回答

2

文字0L上的L後綴使得該文字的類型爲long(64位有符號整數)。

根據Java語言的規則,沒有從longbyte的隱含縮小。

見Java語言規範section 5.2 Assignment Contexts

此外,如果表達式爲byte類型,shortchar的恆定表達(§15.28),或int

  • 的基本收縮如果變量的類型是byteshortchar,則可以使用轉換,並且常數表達式的值可以表示爲th e變量的類型。

注意,常量表達式的類型不包括long

+0

無論哪個規則在上面的代碼中將整數縮小爲字節,不能將相同的規則應用於長(64位)到字節(8位)? – overexchange

+0

@proxchange第一行是一個_numeric_文字 - 它可以被賦予一個'byte'。第三行是「長」,因爲你明確要求了一個。 「長」不能分配給「字節」。有人可能會爭辯說,編譯器可以檢查編譯時間常量,但它不會 - 它們是規則。 –

+0

@proxchange添加了來自JLS的鏈接和相關報價。 – Jesper

0

將原始數據類型轉換爲另一種方法有兩種方法。顯式和隱式。

內隱鑄造如您的情況byte b = 0L;給編譯錯誤,因爲有可能丟失的信息。

如果改變這樣的:

byte b=(byte)0L; 

然後就沒有編譯器錯誤,因爲你是在轉換明確地告訴編譯器。

+0

沒有什麼像顯式和隱式投射。我們在java中擴展(隱式),縮小(隱式)和強制轉換(顯式) – overexchange