Java - 如何将类型集合转换为ArrayList?

时间:2009-12-28 05:12:13

标签: java collections

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;

以下是错误消息:

  

线程“main”中的异常java.lang.ClassCastException:   java.util.Collections $ UnmodifiableCollection无法强制转换为   的java.util.ArrayList ...

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:76)

正如其他人所提到的,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);
}

但是,这表示提取节点是一种非常低效的方法。您可能想要做的是将节点存储在二叉树中,然后当您收到第n个节点的请求时,执行二进制搜索。

答案 1 :(得分:19)

试试此代码

将ArrayList转换为Collection

  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 );

答案 2 :(得分:6)

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;
}

使用上述方法将集合转换为列表

答案 3 :(得分:3)

以下代码将失败:

List<String> will_fail =  (List<String>)Collections.unmodifiableCollection(new ArrayList<String>());

这样可以起作用:

List<String> will_work = new ArrayList<String>(Collections.unmodifiableCollection(new ArrayList<String>()));

答案 4 :(得分:1)

确定答案需要更多信息,但此代码

myNodeList = (ArrayList<MyNode>)this.getVertices();
如果this.getVertices()返回List<MyNode>的(子类型),

工作。如果它是一个不同的集合(就像你的异常似乎表明的那样),你想使用

new ArrayList<MyNode>(this.getVertices())

只要getVertices返回Collection类型,这将有效。