[英]Java Downcasting Conversion
為什么 char c = 65 有效而不拋出錯誤但 float d = 65.0 無效並拋出靜態錯誤:分配中的錯誤類型:從雙精度型到浮型? 兩個人不都垂頭喪氣嗎?
我可以從引用一句JLS 5.2節,並說“這是這樣的,因為語言規范是這么說的”,但不會滿足不是嗎?
我對為什么設計這樣的語言的有根據的猜測:
將65
轉換為char
,您真正要做的只是在二進制表示中去掉一堆無關緊要的 0,因為char
是 16 位,而int
是 32 位。 這就像將 0065 變成 65。
另一方面, 65.0
是一個double
65.0
值並且以浮點格式表示。 請注意,通常,這種表示只是真實值的近似值。 有關更多信息,請參閱此帖子。 位數越多,近似效果越好。 因此,從double
(64 位)轉換為float
(32 位)有點像將 0.333333 轉換為 0.333。 希望您同意,這比將 0065 轉換為 65 損失的信息更大。因此,這不是應該自動執行的轉換。 程序員需要意識到這種情況正在發生。
無論如何,為了完整起見,這是語言規范的相關部分:
賦值上下文允許使用以下之一:
...
此外,如果表達式是
byte
、short
、char
或int
類型的常量表達式(第 15.28 節):
- 如果變量的類型是 byte、short 或 char,並且常量表達式的值可以在變量的類型中表示,則可以使用縮小原語轉換。
因此,語言規范對 byte、short、char 和 int 進行了特殊處理,允許它們在賦值上下文中進行縮小轉換。 請注意,表達式必須是:
char x = 100000;
是無效的。float d = 65.0;
65.0 不是浮點值。 這是一個雙重價值。 輸入浮點值時,數字必須以字母 f 結尾。
你看這里。
float d = 65.0f;
如果你想給 d 給 65 而不必寫字母 f,你可以執行以下操作。
float d = (float)65.0;
這被稱為窄鑄造。
Java 意義上的65.0
是雙倍的,因為.
. 如果你希望這個數字是一個浮點數,只需在它后面添加f
。
float d = 65.0f
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.