2013-06-04 100 views
4

爲什麼下面不返回整數列表?Arrays.asList返回類型不匹配混淆

int[] ints = new int[] { 1, 2, 3, 4, 5 }; 
List<Integer> intsList = Arrays.asList(ints); //compilation error 

但是,相反的int[]

雖然這

String[] strings = new String[] { "Hello", "World" }; 
List<String> stringsList = Arrays.asList(strings); 

返回列表中的String列表。我猜是因爲它是一個原始數組而失敗了,但爲什麼呢?我該如何返回一個int的列表。

+0

你只能在'List'中有'Object'。這排除了int列表。 –

+1

我希望它會被自動裝箱。 – arynaq

+0

但列表給他一個編譯錯誤。 – eternay

回答

2

TList<T>必須是java.lang.Object一些亞型,這int不是。唯一的解釋是,因爲我們使用的是...,所以您提供的是int[]的數組,即int[][]。所以你得到List<int[]>

StringObject的子類型,所以它按預期工作。在J2SE 5.0中引入可變參數之前,它也是唯一可行的方法。通常,現有代碼的解釋不應在語言版本之間改變。

現在,如果你想要一個List<Integer>你可以通過和框中的每個整數。如果程序中有很多這些元素,那麼內存可能是一個問題。您可能希望使用第三方庫,該庫可使用int[]緊湊地支持List<Integer>,或者僅使用基元數組。不幸的是,Java不支持值類型。

7

這是因爲Arrays.asList(new int[] { 1, 2, 3, 4, 5 })將創建一個List<int[]>與一個項目,而不是List<Integer>與五個項目。

不過請注意,這會做你所期望的:

List<Integer> intsList = Arrays.asList(1, 2, 3, 4, 5); 

你的其他選擇是:

  • 在首位創建Integer[],或
  • 來填充列表一個循環
+0

是的,我已經嘗試過,但它的工作,但與億美元的int []? – arynaq

+0

@arynaq然後,你的兩個選擇是創建一個'Integer []'而不是'int []'或者在一個循環中填充你的列表。 – assylias

3

該方法被定義爲: public static <T> List<T> asList(T... a)

因此,在您的第一種情況下,Tint[],並且您正在將單個對象傳遞給該方法(即,數組),因此它返回一個int[]的列表。

我覺得你與asList(1, 2, 3, 4, 5)(即5項)誤

+0

沒錯。 +1記住。在Java中,如果你喜歡,你可以調用一個參數類型爲T的類型爲T的變量。這就是爲什麼簽名很重要。 –

+0

在Java中沒有'int'的'List'這樣的東西。 –

+0

錯字。固定。謝謝。 – mprivat