Domanda Java - Come convertire la raccolta di tipi in 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;

Il seguente è il messaggio di errore:

Eccezione nella discussione "main" java.lang.ClassCastException:   java.util.Collections Non è possibile eseguire il cast di $ UnmodifiableCollection   java.util.ArrayList ...

Qualcuno può aiutare?


44
2017-12-28 05:12


origine


risposte:


Come altre persone hanno menzionato, ArrayList ha un costruttore che prende una collezione di elementi e li aggiunge tutti. Ecco la documentazione:

http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29

Quindi devi fare:

ArrayList<MyNode> myNodeList = new ArrayList<MyNode>(this.getVertices());

Tuttavia, in un altro commento hai detto che ti stava dando un errore nel compilatore. Sembra che la tua classe MyGraph sia un generico classe. E così getVertices () restituisce in realtà il tipo V, non digita myNode.

Penso che il tuo codice dovrebbe assomigliare a questo:

public V getNode(int nodeId){
        ArrayList<V> myNodeList = new ArrayList<V>(this.getVertices());
        return myNodeList(nodeId);
}

Ma, detto questo, è un modo molto inefficiente per estrarre un nodo. Quello che potresti voler fare è archiviare i nodi in un albero binario, quindi quando ottieni una richiesta per l'ennesimo nodo, fai una ricerca binaria.


70
2017-12-28 05:29



Prova questo codice

Converti ArrayList in Raccolta

  ArrayList<User> usersArrayList = new ArrayList<User>();

  Collection<User> userCollection = new HashSet<User>(usersArrayList);

Converti Raccolta in ArrayList

  Collection<User> userCollection = new HashSet<User>(usersArrayList);

  List<User> userList = new ArrayList<User>(userCollection );

19
2018-01-24 11:04



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

Usa il metodo sopra per convertire la collezione in lista


5
2018-04-19 15:36



Il seguente codice fallirà:

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

Questo invece funzionerà:

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

3
2018-06-04 04:30



Ulteriori informazioni necessarie per una risposta definitiva, ma questo codice

myNodeList = (ArrayList<MyNode>)this.getVertices();

volere solo lavoro se this.getVertices() restituisce un (sottotipo di) List<MyNode>. Se si tratta di una collezione diversa (come la tua eccezione sembra indicare), la si vuole usare

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

Questo funzionerà finché un tipo di raccolta viene restituito da getVertices.


1
2017-12-28 05:18