Reputation: 62145
I have this method which takes a varargs of Strings, creates a List out of it, and then tries to remove the first element of the list.
public void importFrom(String... files) {
List<String> fileList = Arrays.asList(files);
String first = fileList.remove(0);
// other stuff
}
But as soon as remove
gets called, an UnsupportedOperationException
is thrown. My guess is that the return List-Type does not support the remove method. Am I correct? What alternatives do I have?
Upvotes: 1
Views: 970
Reputation: 63688
The returned list acts as a view
for the backed array. You can not modify the list directly but only through the backed array. However, you cannot resize the array.
Upvotes: 0
Reputation: 66213
Arrays.asList
only provides a thin wrapper around an array. This wrapper allows you to do most operations on an array using the List
API. A quote from the JavaDoc:
Returns a fixed-size list backed by the specified array. [...] This method acts as bridge between array-based and collection-based APIs [...]
If you really want to remove something, then this might work:
List<String> realList = new ArrayList<String>(Arrays.asList(stringArray));
This one creates a real ArrayList
(which supports remove
) and fills it with the contents of another list which happens to be the wrapper around your String[]
.
Upvotes: 7
Reputation: 115328
Arrays.asList()
returns instance of Arrays.ArrayList
that that is unmodifireable list because it is a simple wrapper over array. You cannot remove elements from array.
This is written in javadoc of asList()
:
Returns a fixed-size list backed by the specified array.
Upvotes: 1
Reputation: 28158
Arrays.asList
provides a List view of the array, BACKED by the array. And arrays are not resizable. Any attempt to change its size will throw an exception.
Upvotes: 4
Reputation: 5674
You could just create a new ArrayList<String>()
, then loop over all files for (String file : files) fileList.add(file);
. Or you could use the List you already created and add it to the new ArrayList using fileList.addAll(files);
Upvotes: 2