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 ...
有人可以帮忙吗?
答案 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类型,这将有效。