我注意到Java SE 6和Java SE 7之間的自動拆箱行爲有所不同。我想知道爲什麼這樣,因爲我找不到任何更改文檔在這兩個版本之間的行爲中。Java 6與Java 7之間的自動拆箱差異
這裏有一個簡單的例子:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
編譯沒有從的Java SE 7的javac不過,如果我給編譯器的「-source 1.6」的說法,我得到的最後一行的錯誤:
inconvertible types
found : java.lang.Object
required: int
我嘗試下載Java SE 6以使用原生版本6編譯器(沒有任何-source選項)進行編譯。它同意並給出與上述相同的錯誤。
那麼是什麼給?從更多的實驗看來,Java 6中的拆箱似乎只能清除(在編譯時)清空盒裝類型的值。舉例來說,這部作品在兩個版本:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
如此看來,Java的6和7之間,拆箱功能得到加強,以便能夠一舉投和拆箱的對象類型,不知道(在編譯時)該值是正確的盒裝類型。然而,通過閱讀Java語言規範或Java 7發佈時編寫的博客文章,我看不到任何這種變化,所以我想知道變化是什麼以及這個「特性」被稱爲什麼?
只是好奇:由於變化,有可能引發「錯誤」 unboxings:
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
編譯沒有問題,但給在運行時一個ClassCastException。
對此有何參考?
有趣。自動裝箱混亂的新成分。我認爲你的例子可以用一個單一的對象而不是一個數組更簡單和清晰。 Integer obj = new Integer(2); int x =(int)obj;':在Java 7上工作,在Java 6上給出錯誤。 – leonbloy 2013-04-20 12:15:55
您正在使用哪個JDK?它可能也必須與不同的供應商... – 2013-04-20 12:48:04
@leonbloy:關於簡化的好處,我做了一些簡化(從我的原始代碼),但不知何故停了太早! – Morty 2013-04-20 15:20:52