2016-04-17 76 views
0

我知道java(c?)可以裝箱和取消箱類型並在必要時在原始類型之間進行轉換,但是爲什麼它不想同時做到這一點時間。Java不會在同一時間框和轉換原始類型

例如,如果我是這樣做:

ArrayList<Byte> bytes = new ArrayList<>(); 
bytes.add(8); 

javac的會產生恐慌,並告訴我Collection.add(Byte)是不適用的,但都被我用ArrayList<Integer>,而不是它不會是一個問題。 如果我會做byte aByte = 8; bytes.add(aByte);它也可以很好地編譯。

這是爲什麼,這是否有很好的理由?

+1

這是因爲,您希望將字符型int轉換爲字節,int = 4個字節,而字節爲一個字節,因此您要下去,因爲Java不會在您的位置決定,因爲您需要一個EXPLICIT CAST因爲也許你會失去一些數據,如果你想要增加(以字節數爲單位),例如:從int到double,Java將爲你做一個IMPLECIT CAST :) –

回答

4

發生這種情況的原因是因爲如果你做bytes.add(8),8被作爲int來處理。所以,下面的錯誤被拋出:如果您想直接加8

在ArrayList類型<字節Add方法(字節)>不 適用於參數(INT)

ArrayList中,你必須投8字節

bytes.add((byte)8); 

這是不可能處理8爲byte在必要的時候,在其他情況下,作爲一個int

下面的例子中想:

private static void test() { 
    Object o = 8; 
} 

現在就不會出現指定的,如果你想8爲byteint。 所以數字總是作爲整數處理,而不是作爲字節處理。所以JVM可以將8包裝到正確的包裝類中。在這個例子中,o.getClass()java.lang.Integer

同樣的事情是與小數,例如。 2.3被定義爲雙精度,如果您想將2.3作爲float必須寫入2.3f

+0

Man Dimi你更快。只是想寫完整的。 :P 帶我upvote –

+0

是的,這正是我所說的,我問的是爲什麼java不把8作爲一個字節? –

+0

我更新了我的答案,我希望這會讓它更清楚爲什麼數字必須始終以相同類型處理@ S.Klumpers – Dimi