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.