2010-09-09 38 views
5

據我所知,下面的代碼將不工作Autoboxing /加寬發生在Short a = 3,但不在Float a = 3;

Float a=3 

因爲其翻譯爲一個浮點數= Integer.valueOf(3)。我們將在LHS上有一個Float引用,並且在RHS上有一個Integer對象,這是不兼容的。但是:

1.

 `Short a=3;` 

這工作,但在這裏,我們必須在LHS和RHS中Integer對象簡短的參考。

2.

Float a=(Float) 3

如果我們沒有類型強制轉換3,它會被翻譯成Integer.valueOf(3)。現在,它會被翻譯爲Float.valueOf(3)?

+0

你有一個Java編譯器?如果是這樣,你可以試試這個。 – DJClayworth 2010-09-09 13:16:07

回答

0

如果您嘗試初始化一個變量的值大於它所能容納的值(不管該值的數字形式如何),編譯器會給您一條錯誤消息。

char c = 0xffff; // max char hex value 
byte b = 0x7f; // max byte hex value 
short s = 0x7fff; // max short hex value 

注意在上面的代碼中char,byte和short的最大可能的十六進制值。如果超過這些值,編譯器會自動將該值設置爲一個int值,並告訴您需要對該賦值進行窄化轉換。你會知道你已經超越了界限。

所以在你的情況下Short s = 3實際上變成了Short s = new Short(3)並且工作。

在第二種情況下Float a=(Float) 3將成爲Float.valueOf(3)

(自動裝箱,這就是爲什麼現代的IDE有多種選擇來標記這些自動裝箱爲錯誤,我們可以用valueOf方法一樣代替他們的內存更好的MGMT時的valueOf方法不使用)
+0

謝謝。非常清楚。 u能確認的話,那「浮動A = 3是行不通的,因爲Java不允許強化通過自動裝箱以下」。此外,自動裝箱並不僅僅意味着爲LHS調用適當的包裝器構造函數。如果是這樣,Float a = 3就可以工作。什麼是必須發生的是,自動裝箱前,一個縮小轉換必須發生,使原始類型一樣包裝的基本類型,然後只自動裝箱會發生。我在這裏嗎? – Daud 2010-09-18 10:55:10

1

簡單形式爲:

Float a=3.0f; 

雙類型:

Double b=3.0; 
2

如果你的問題是「爲什麼浮動F = 3;沒有編制,但短期S = 3;呢? 「,那麼答案是:

Java編譯器在整數常量上做了一些特殊的工作,以使它們適合左手邊:找到最合適的類型並使用它。所以,

Short s = 3; 

被編譯成

Short s = Short.valueOf(3); 

從本質上講,當你寫

short s = 3; 

相同奇蹟發生,但這樣做只爲整數,而不是浮點值。

0

無法指定short和byte常量,因此編譯器允許您透明地轉換int常量。 java中有float常量,所以它不支持隱含的轉換。如果你想要一個浮點數/浮點數,我建議你使用一個浮點數常量。

Byte b = 3; 
Short s = 3; 
Integer i = 3; 
Long l = 3L; 
Float f = 3f; 
Double d = 3d; 
相關問題