2013-01-15 57 views
32

我想聲明一個integer類型的ArrayList。爲什麼我不能在ArrayList類型中使用int?

爲什麼下面給我一個錯誤:

ArrayList<int> list1 = new ArrayList<int>(); 

但以下幾項工作:

ArrayList<Integer> list1 = new ArrayList<Integer>(); 
+4

因爲'int'不是在同一個上下文中的對象,所以'Integer'是 – MadProgrammer

+1

如果你想要某個東西,你可以使用'TIntArrayList' int' [ –

+0

] int'是原始數據類型,我們可以在'ArrayList'中使用包裝類。 –

回答

34

ArrayList只能引用類型,而不能引用原語。 Integer是一類,不是原始的。

當你聲明ArrayList<Integer> list1 = new ArrayList<Integer>(),您要創建ArrayList將存儲Integer類型,而不是int原始。

如果你想了解原始和引用類型之間的區別,看看http://pages.cs.wisc.edu/~hasti/cs302/examples/primitiveVsRef.html

+0

您可能不需要新表達式右側的類型參數。 'ArrayList list1 = new ArrayList();'也可以。 –

11

因爲int基本類型。只有參考類型可以用作通用參數。

+0

甚至在泛型之前(Java 5之前)這個限制在那裏,所以我不認爲它是唯一的原因 –

+0

@Pangea:Sure ,你不能'new ArrayList()。add(5)'。但OP在詢問有關特定代碼行的錯誤... –

+0

@OliCharlesworth您可以實際執行該操作。它只是添加一個'Integer'而不是'int'值。 –

0

intprimitive。這不是Object

請參閱此link瞭解更多詳情。

+1

鏈接只有答案不鼓勵在StackOverflow。 –

4

簡短的回答是,仿製藥(如ArrayList<Integer>)不接受基本類型(int),僅對象(Integer)。

這是因爲像ArrayList這樣的類實現爲使用對象。由於每個類都從Object繼承,因此編譯器可以插入其他類。但是原始類型(如int)不會從Object繼承,因爲它們不是類。因此,Sun/Oracle使Integer課程對此有所幫助。因此,總之:int不是Object

+0

這是最好的答案,因爲它解釋了這個聲明,它工作正常:'ArrayList ' –

0

int是基本數據類型,但Integer是一個類,這樣一個ArrayList的數組只能採取引用類型作爲參數不是原始類型

0

上述所有答案的答案爲什麼,但這個問題的根源是頻繁的自動裝箱並對原始數據類型進行拆箱。這個問題已經由IntBuffer或ChadBuffer解決了,或者你已經在nio文件夾中命名了原始類型。下一次,如果你想使用原始的ArrayList不要使用List來代替使用IntBuffer

相關問題