List, Generics und eine List :)

Status
Nicht offen für weitere Antworten.
Hi!

Kann mir jemand sagen, warum ich folgende Zeilen nicht schreiben darf?

Java:
protected List<String> labels;

protected List<List<Edge>> nodes;

public GraphOriginal() {
	labels = new ArrayList<String>();
	nodes = new ArrayList<ArrayList<Edge>>();
}
Wenn ich 'nodes' als List<ArrayList<Edge>> deklariere, gehts. Wieso ist das so?
 
Zuletzt bearbeitet von einem Moderator:
Java:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        List<List<String>> listList;

        List<ArrayList<String>> arrayList = new ArrayList<ArrayList<String>>();
        listList = (List)arrayList; // Check ausschalten

        listList.add(new LinkedList<String>());


        ArrayList<String> l = arrayList.get(0); // ClassCastException
    }
}
 
Das verstehe ich nicht - kannst du mir vielleicht sagen, warum die doppelte List nicht geht?

Beziehungsweise... In der letzten Zeile verwendest du ne ArrayList, was zu ner Exception führt - das verstehe ich. Ich hätte allerdings da wieder ne List (keine ArrayList) verwendet...
 
Zeile 11
> listList.add(new LinkedList<String>());

in eine List<List<?>> kann man offensichtlich eine LinkedList<?> einfügen, was etwas anderes als eine ArrayList<?> ist

wenn man aus der ArrayList<ArrayList<?>> dann Objekt 0 abfragt wie in Zeile 14, dann führt das zu einer ClassCastException,
was ist daran unverständlich?

> ich hätte allerdings da wieder ne List (keine ArrayList) verwendet...

ich verwende die erzeugte Liste in ihrem ursprünglichen Typ, das ist ja nicht verboten
 
Okay, nicht verboten, aber doch wohl auch nicht hübsch, oder?
Ich habe gelernt, dass man Rückgabewerte immer als List gibt, nicht in der konkreten Implementierungsklassen um genau diesen ClassCastExceptions aus dem Weg zu gehen. Was intern mit der ArrayList / LinkedList passiert ist mir egal, ich möchte eigenltich nur die von List bereitgestellten Methoden nutzen.
 
> Ich habe gelernt, dass man Rückgabewerte immer als List gibt, nicht in der konkreten Implementierungsklassen

sehr gut gelernt, und genau deshalb solltest du auch
new ArrayList<List<?>>()
definieren, dann gäbe es weder eine ClassCastException noch eine Compilerfehlermeldung,
alles wäre in Butter,

ich erkläre dir, warum es zu der Fehlermeldung kommt, nicht was schön ist oder nicht 😉
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben