2011-10-31 18 views
1

我有這種方法需要一個字符串的可變參數,創建一個List,然後嘗試刪除列表的第一個元素。當調用list.remove時發生奇怪UnsupportedOperationException(0)

public void importFrom(String... files) { 
    List<String> fileList = Arrays.asList(files); 

    String first = fileList.remove(0); 
    // other stuff 
} 

但只要remove被調用,一個UnsupportedOperationException被拋出。我的猜測是返回List-Type不支持remove方法。我對麼?我有什麼替代方案?

+0

看起來像一個編譯錯誤。你有2個稱爲文件的變量,一個是另一個數組的列表。你能提供可編譯的代碼,然後我們可以看看爲什麼你會得到這個錯誤。 – sethu

+1

返回的列表充當備份數組的「視圖」。您無法修改列表。 –

+0

@sethu只是一個錯字,修正了這個錯誤。 – helpermethod

回答

7

Arrays.asList只提供數組周圍的薄包裝。該包裝允許您使用List API在陣列上執行大多數操作。來自JavaDoc的報價:

返回一個固定大小的由指定數組支持的列表。 [...] 此方法充當之間的橋樑基於陣列和基於集合的API [...]

如果你真的要刪除的東西,那麼這可能工作:

List<String> realList = new ArrayList<String>(Arrays.asList(stringArray)); 

這個人創建了一個真實的ArrayList(支持remove),並用另一個列表的內容填充它,恰好是你的String[]的包裝。

+0

+1謝謝,這似乎是最好的解決方案。 – helpermethod

2

您可以創建一個new ArrayList<String>(),然後遍歷所有文件for (String file : files) fileList.add(file);。或者您可以使用已創建的列表並將其添加到新的ArrayList中使用fileList.addAll(files);

4

Arrays.asList提供了數組的列表視圖,該列表視圖由數組BACKEDED。數組不可調整大小。任何改變其大小的嘗試都會引發異常。

1

Arrays.asList()返回Arrays.ArrayList的實例,它是不可修改的列表,因爲它是一個簡單的數組封裝器。你不能從數組中移除元素。

這被寫入的asList()的Javadoc:

返回由指定數組支持的固定大小的列表。

+1

這不是不可修改的。 javadoc說:「(對返回列表的更改」通過「寫入數組。」)。 –

+0

@Stephen C,你是對的。我只是用了錯誤的名詞。 – AlexR

0

返回的列表對於支持的陣列充當view。您不能直接修改列表,但只能通過備份陣列進行修改。但是,您無法調整數組大小。

相關問題