1 回答

TA貢獻1812條經驗 獲得超5個贊
首先,賦值轉換,JLS 5.2涵蓋了可以賦值的值。
此外,如果表達式是
byte
、short
、char
或 類型的常量表達式 (§15.28)?int
:
如果變量的類型為 、 或 ,并且常量表達式的值可以用變量的類型表示,則可以使用縮小基
byte
元short
轉換char
。
對于byte a = 0;
常量表達式 是 ,int
?0
它被縮小為 a?byte
。
接下來,調用上下文,JLS 5.3介紹了可以將哪些值傳遞給方法。
嚴格或松散的調用上下文都不包括賦值上下文中允許的整數常量表達式的隱式縮小。
因此,您的代碼對于調用上下文(方法調用)中不允許的常量表達式縮小轉換存在編譯器錯誤。
setByte(0);?//?no?implicit?narrowing?conversion,?even?if?it's?a?constant?expression void?setByte(byte?b){}
您的代碼128 - 1
是一個縮小為byte
.
但是,2147483648 - 1
由于2147483648
它本身不是有效的int
文字,因此被禁止,第 3.10.1 節“整數文字”。
如果十進制文字 2147483648 出現在除一元減運算符的操作數之外的任何位置,則會出現編譯時錯誤;或者如果 int 類型的十進制文字大于 2147483648 (2?31?)。
如果您確實想使用不必要的復雜表達式來初始化int
,您可以使用long
文字使表達式合法:
2147483648L?-?1
但隨后您必須將表達式顯式轉換為int
;?不存在從任何比 更寬的int
內容到 的隱式縮小int
:
(int)?(2147483648L?-?1)
奇怪的是,您不必在表達式周圍放置括號,以便強制轉換適用于整個表達式,盡管為了清楚起見,我強烈建議使用括號。
(int)?2147483648L?-?1??//?It's?2147483647!
對超出范圍的文字int
進行強制轉換將產生 -2147483648,一個有效值。這里減 1 涉及負方向溢出,產生預期值 2147483647。long
int
int
添加回答
舉報