Java - Как преобразовать коллекцию типов в ArrayList?
public class MyGraph<V,E> extends SparseMultigraph<V,E>{
private ArrayList<MyNode> myNodeList;
public MyNode getNode(int nodeId){
myNodeList = new ArrayList<MyNode>();
myNodeList = (ArrayList<MyNode>)this.getVertices();
int i;
Ниже приведена ошибка msg:
Исключение в потоке "main" java.lang.ClassCastException: java.util.Collections $UnmodifiableCollection нельзя отбрасывать java.util.ArrayList...
Может ли кто-нибудь помочь?
Ответы
Ответ 1
Как отмечали другие люди, ArrayList имеет конструктор, который берет набор элементов и добавляет все из них. Здесь документация:
http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29
Итак, вам нужно сделать:
ArrayList<MyNode> myNodeList = new ArrayList<MyNode>(this.getVertices());
Однако в другом комментарии вы сказали, что давали вам ошибку компилятора. Похоже, ваш класс MyGraph является общим классом. И поэтому getVertices() фактически возвращает тип V, а не тип myNode.
Я думаю, что ваш код должен выглядеть так:
public V getNode(int nodeId){
ArrayList<V> myNodeList = new ArrayList<V>(this.getVertices());
return myNodeList(nodeId);
}
Но это говорит о очень неэффективном способе извлечения node. Что вы можете захотеть сделать, это сохранить узлы в двоичном дереве, а затем, когда вы получите запрос на nth node, вы выполните двоичный поиск.
Ответ 2
Попробуйте этот код
Преобразовать ArrayList в коллекцию
ArrayList<User> usersArrayList = new ArrayList<User>();
Collection<User> userCollection = new HashSet<User>(usersArrayList);
Преобразование коллекции в ArrayList
Collection<User> userCollection = new HashSet<User>(usersArrayList);
List<User> userList = new ArrayList<User>(userCollection );
Ответ 3
public <E> List<E> collectionToList(Collection<E> collection)
{
List<E> list;
if (collection instanceof List)
{
list = (List<E>) collection;
}
else
{
list = new ArrayList<E>(collection);
}
return list;
}
Используйте приведенный выше метод для преобразования коллекции в список
Ответ 4
Следующий код не будет выполнен:
List<String> will_fail = (List<String>)Collections.unmodifiableCollection(new ArrayList<String>());
Это будет работать:
List<String> will_work = new ArrayList<String>(Collections.unmodifiableCollection(new ArrayList<String>()));
Ответ 5
Дополнительная информация, необходимая для окончательного ответа, но этот код
myNodeList = (ArrayList<MyNode>)this.getVertices();
будет работать, только если this.getVertices()
возвращает (подтип) List<MyNode>
. Если это другая коллекция (например, ваше исключение, похоже, указывает), вы хотите использовать
new ArrayList<MyNode>(this.getVertices())
Это будет работать до тех пор, пока getVertices возвращается тип Collection.